R语言 在新添加的列上强加额外的筛选器

kse8i1jr  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(93)

我有df,我可以生成新的列varA没有任何问题,如下所示。

df <- tribble(
  ~Gender, ~Age, ~x, ~y, ~z,
  1, 15, 1, 1, 0, 
  1, 14, 1, 1, 1, 
  2, 12, 0, 0, 1, 
  1, 18, 1, 0, 0, 
  2, 19, 0, 0, 0, 
  2, 22, 1, 0, 1,
  1, 11, 0, 1, 1, 
  1, 13, 1, 1, 1, 
  2, 10, 1, 0, 1,
)

df$varA <- ifelse(rowSums(df[c("x", "y", "z")] == 1) > 1, 1, 0)

但我想要的是基于两个条件的varA:1)仅适用于性别类别1,2)仅适用于10-14岁(含)之间的人。我尝试了dplyr动词,但遇到了一个问题。

df <- df %>%
  filter(Gender == 1 & Age > 9 & Age < 15) %>%
  mutate(
    varA = ifelse(rowSums(df[c("x", "y", "z")] == 1) > 1, 1, 0)
  )

此外,如果有人能建议任何基础R的方式来完成这项任务,我将不胜感激。

f4t66c6m

f4t66c6m1#

这就是你要找的吗?

df$varA <- ifelse(df$Gender == 1 &                        # 1st condition
                  df$Age >= 10 & df$Age <= 14 &           # 2nd condition
                  rowSums(df[c("x", "y", "z")] == 1) > 1, # 3rd condition
                  1, 0)

使用dplyr

df %>%
  mutate(
    varA = ifelse(Gender == 1 &
                  Age >= 10 & Age <= 14 &  
                  # or: between(Age, 10, 14) & (thxs to zephryl)
                  rowSums(across(c("x", "y", "z"), ~.x == 1)) > 1,
                  1, 0)
  )

相关问题