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

时间:2019-10-31 18:56:19

标签: r dataframe multidimensional-array

我有一个看起来像虹膜的数据框。我想创建另一个名为C1的列,它是所有setosa Sepal.Length乘以2.5,所有Versicolor Sepal.Length乘以3.5和所有Virginica Sepal.Length乘以4.5的乘积。有人可以帮我编码吗?

预期

间隔长度间隔宽度花瓣长度宽度物种C1            5.1 3.5 1.4 0.2 setosa 5.1 * 2.5            4.9 3.0 1.4 0.2 setosa 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 个答案:

答案 0 :(得分:1)

一种选择是创建一个名为vector的值来替换基于“种类”的值,并乘以“ Sepal.Length”

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

答案 1 :(得分:1)

备选方案使用合并/联接方法确定使用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

并将其存储在列中或其他地方。