我的数据框:
class columnA
foo 10
bar 14.2
hello 48695
bar 4
foo -7
我试图执行以下操作:
if (my_df$class== "foo") {
my_df$columnB <- my_df$columnA * 2
}else{
if (my_df$class == "bar") {
my_df$columnB <- my_df$columnA * 5
}else{
my_df$columnB <- my_df$columnA * 10
}
}
编辑:我也试过这个:
ifelse (my_df$class== "foo",
my_df$columnB <- my_df$columnA * 2
ifelse (my_df$class== "bar",
my_df$columnB <- my_df$columnA * 5,
my_df$columnB <- my_df$columnA * 10
)
)
由于它不起作用,让我用伪代码说明:
for each row,
if the value in column class is "foo"
set the value in column B to be 2 times the value in column A
if the value in column class is "bar"
set the value in column B to be 5 times the value in column A
if the value in column class is something else
set the value in column B to be 10 times the value in column A
我的问题当然是使用分配运算符:如果我使用<-
,整个columnB
列最终会columnA
乘以5
(因为它是这样的)发生最后一行的class
值为bar
)。
任何解决方案?
我会采用一种解决方案来解决我的问题,而无需通过这种if/elseif/else
语法,但如果有人能提供保持此语法的解决方案,我也非常感谢学习。
由于
答案 0 :(得分:1)
使用dplyr包你可以这样做:
my_df <- my_df %>%
mutate(columnB = ifelse(class == "foo", columnA*2,
ifelse(class == "bar", columnA*5, columnA*10)
)
)
答案 1 :(得分:1)
if
未进行矢量化,因此您可以尝试使用ifelse
例如
my_df$columnB=ifelse(my_df$class== "foo",my_df$columnA * 2,
ifelse(my_df$class == "bar",my_df$columnA * 5,my_df$columnA * 10))
答案 2 :(得分:1)
您也可以使用索引和数学的组合,而不是使用嵌套的ifelse
:
indx <- (mydf$class == "foo") + 1L + (mydf$class == "bar")*2
mydf$colB <- mydf$columnA*c(10, 2, 5)[indx]
给出:
> mydf
class columnA colB
1 foo 10.0 20
2 bar 14.2 71
3 hello 48695.0 486950
4 bar 4.0 20
5 foo -7.0 -14