以其他列为条件向数据帧列添加常量



我想在与另一列中的某个条件匹配的新列的行中添加一个常量。

我的模拟数据:

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等于b,则将该值进一步增加1;并且如果var3等于c,则将其进一步增加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

我尝试了以下操作,但它只会将值替换为1,而不会将其增加1:

df$newvar[df$var1 == "a"] <- +1
df$newvar[df$var1 == "b"] <- +1
df$newvar[df$var1 == "c"] <- +1

我们可以在dplyr中使用rowwise,并计算每行满足的条件数。

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"))

跟随您的路径并使用基本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

使用ifelse突变而不是上面的逐行解决方案的另一种方法是:

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))

我们可以使用rowSums

df$newVar <- rowSums(df == c('a', 'b', 'c')[col(df)])
df$newVar
#[1] 3 2 1 3 2 2 2 0

相关内容

  • 没有找到相关文章

最新更新