我不确定标题是否足以描述我的问题。我有一个数据框,其中包含1:n
和A
两个组的B
集,可能的状态为Calm
,Action1
和Action2
。
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
我想创建一个满足以下条件的新列。
如果在一组(每组)中出现Action1
或Action2
而不是写入新列,则状态Action
也适用于Status
Calm
。
新列中的结果应为c(rep("Action", 8), rep("Calm", 4))
。
我无法解决此数据框中多重条件的问题。希望,有人可以帮助我并原谅我对这个问题的非数学描述。
答案 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
答案 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
命令可以合并为一个。