我想向新列中符合另一列中特定条件的行添加一个常量。
我的模拟数据:
df <- structure(list(var1 = c("a", "b", "c", "a", "a", "a", "a", "d"),
var2 = c("b", "b", "a", "b", "b", "c", "a", "c"),
var2 = c("c", "c", "c", "c", "d", "c", "c", "a")),
.Names = c("var1", "var2", "var3"),
row.names = c(NA, 8L),
class = "data.frame")
如下所示:
> df
var1 var2 var3
1 a b c
2 b b c
3 c a c
4 a b c
5 a b d
6 a c c
7 a a c
8 d c a
现在,我想添加一个newvar
,如果var1
等于a
,则增加1;如果var2
等于{{1, }},如果b
等于var3
,则再增加1。也就是说,我的数据应如下所示:
c
我已经尝试了以下方法,但是它只会将值替换为1,而不会将它们增加1:
> df
var1 var2 var3 newvar
1 a b c 3
2 b b c 2
3 c a c 1
4 a b c 3
5 a b d 2
6 a c c 2
7 a a c 2
8 d c a 0
答案 0 :(得分:1)
我们可以在rowwise
中使用dplyr
并计算每一行满足的条件数。
library(dplyr)
df %>%
rowwise() %>%
mutate(new_var = sum(c(var1 == "a", var2 == "b" , var3 == "c")))
# var1 var2 var3 new_var
# <chr> <chr> <chr> <int>
#1 a b c 3
#2 b b c 2
#3 c a c 1
#4 a b c 3
#5 a b d 2
#6 a c c 2
#7 a a c 2
#8 d c a 0
或基本R方法
df$new_var <- Reduce("+", list(df$var1 == "a", df$var2 == "b", df$var3 == "c"))
答案 1 :(得分:1)
遵循路径并使用base R的快速方法是:
df$newVar = 0
df$newVar[df$var1 == "a"] <- df$newVar[df$var1 == "a"] +1
df$newVar[df$var2 == "b"] <- df$newVar[df$var2 == "b"] +1
df$newVar[df$var3 == "c"] <- df$newVar[df$var3 == "c"] +1
答案 2 :(得分:1)
使用 ifelse 和 mutate 而不是上面的 rowwise 解决方案的另一种方式是:
library(dplyr)
df %>% mutate(newVar = ifelse(var1 == "a",1,0) + ifelse(var2 == "b",1,0) +
ifelse(var3 == "c",1,0))
然后,您可以将常量调整为所需的任何值。如果要在数据框中包含新列,只需将mutate的结果分配给数据框:
df <- df %>%
mutate(newVar = ifelse(var1 == "a",1,0) + ifelse(var2 ==
"b",1,0) + ifelse(var3 == "c",1,0))
答案 3 :(得分:0)
我们可以使用rowSums
df$newVar <- rowSums(df == c('a', 'b', 'c')[col(df)])
df$newVar
#[1] 3 2 1 3 2 2 2 0