我有一个看起来像虹膜的数据框。我想创建另一个名为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
'' '' '' '' '' ''
答案 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
并将其存储在列中或其他地方。