提问者:小点点

如何将特定的行和列值乘以常量来创建新列?


例如,我有一个看起来像iris的数据帧。我想创建另一个名为C1的列,它是所有刚毛萼片的乘法。长度2.5,全部花色萼片。长度为3.5,全部为维吉尼亚萼片。长度增加4.5。有人能帮我编码吗?

预料之外

萼片。萼片长。宽花瓣。长花瓣。宽度物种C1 5.1 3.5 1.4 0.2刚毛5.1*2.5 4.9 3.0 1.4 0.2刚毛4.9*2.5“

       6.4         3.2          4.5         1.5    versicolor    6.4*3.5
       6.9         3.1          4.9         1.5    versicolor    6.9*3.5
        ''          ''           ''          ''        ''          ''

       7.1         3.0          5.9         2.1     virginica     7.1*4.5
       6.3         2.9          5.6         1.8     virginica     6.3*4.5
        ''          ''           ''          ''        ''            ''

共2个答案

匿名用户

一个选项是创建一个名为的向量来替换基于“物种”的值,并用“Sepal”相乘。长

library(dplyr)
iris <- iris %>% 
          mutate(C1 = Sepal.Length * set_names(c(2.5, 3.5, 4.5),
             c("setosa", "versicolor", "virginica"))[as.character(Species)])
head(iris, 3)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species    C1
#1          5.1         3.5          1.4         0.2  setosa 12.75
#2          4.9         3.0          1.4         0.2  setosa 12.25
#3          4.7         3.2          1.3         0.2  setosa 11.75

匿名用户

另一种方法是使用合并/联接方法来确定将2.5、3.5和4.5中的哪一个用作乘数。

iris2 <- merge(iris,
               data.frame(Species=c("setosa", "versicolor", "virginica"), mult=c(2.5,3.5,4.5)),
               by = "Species")
head(iris2)
#   Species Sepal.Length Sepal.Width Petal.Length Petal.Width mult
# 1  setosa          5.1         3.5          1.4         0.2  2.5
# 2  setosa          4.9         3.0          1.4         0.2  2.5
# 3  setosa          4.7         3.2          1.3         0.2  2.5
# 4  setosa          4.6         3.1          1.5         0.2  2.5
# 5  setosa          5.0         3.6          1.4         0.2  2.5
# 6  setosa          5.4         3.9          1.7         0.4  2.5

由此,计算起来很琐碎:

head(iris2$mult * iris2$Sepal.Length, n = 10)
#  [1] 12.75 12.25 11.75 11.50 12.50 13.50 11.50 12.50 11.00 12.25

并将其存储在列中或其他位置。