R按多个条件为值集创建一个新列

时间:2017-02-20 20:11:20

标签: r

我不确定标题是否足以描述我的问题。我有一个数据框,其中包含1:nA两个组的B集,可能的状态为CalmAction1Action2

  triggers <- c("Action1", "Action2") 
  df <- data.frame(Set    = c(rep(1, 4), rep(2, 4), rep(1, 4)),                                                                             
                   Group  = c(rep("A", 4), rep("A", 4), rep("B", 4)),                                                                     
                   Status = c(rep("Calm",3), "Action1", rep("Calm",3), 
                                "Action2", rep("Calm", 4))) 
Set Group Status
1    A    Calm
1    A    Calm
1    A    Calm
1    A    Action1
2    A    Calm
2    A    Calm
2    A    Calm
2    A    Action2
1    B    Calm
1    B    Calm
1    B    Calm
1    B    Calm

基于向量triggers我想创建一个满足以下条件的新列。

如果在一组(每组)中出现Action1Action2而不是写入新列,则状态Action也适用于Status Calm

新列中的结果应为c(rep("Action", 8), rep("Calm", 4))

我无法解决此数据框中多重条件的问题。希望,有人可以帮助我并原谅我对这个问题的非数学描述。

3 个答案:

答案 0 :(得分:1)

这应该有效:

df %>% dplyr::group_by(Group, Set) %>% 
  do(mutate(. ,result = ifelse(any(Status %in% triggers), "Action", "Calm")))

Source: local data frame [12 x 4]
Groups: var2, var1 [3]
    Set  Group    Status result
   <dbl> <chr>   <chr>  <chr>
1      1     A    Calm Action
2      1     A    Calm Action
3      1     A    Calm Action
4      1     A Action1 Action
5      2     A    Calm Action
6      2     A    Calm Action
7      2     A    Calm Action
8      2     A Action2 Action
9      1     B    Calm   Calm
10     1     B    Calm   Calm
11     1     B    Calm   Calm
12     1     B    Calm   Calm

答案 1 :(得分:1)

以下是data.table解决方案

library(data.table)
dt1 <- setDT(df)
dt1[, result := ifelse(sum(Status %in% triggers) == 0, "Calm", "Action"), by = .(Group, Set)]

使用提供的数据集,这大约是使用dplyr

的6.5倍

答案 2 :(得分:0)

考虑dft作为您的inut数据框,您可以使用dplyr并尝试:

dft %>% 
  group_by(Group, Set) %>%
  mutate(nc = if_else( Status %in% triggers, 1, 0)) %>%
  mutate(nc = max(nc)) %>%
  mutate(nc2 = if_else(nc == 1, "Action", as.character(Status))) %>%
  select(nc2)

P.S。第二个和第三个mutate命令可以合并为一个。