我有一个长格式的分层数据框架,其中每一行代表各种关系,其中许多可以属于一个人。这是一个小的示例数据集的代码:
df <- data.frame(id = as.factor(c(1,1,1,2,2,3,4,4)),
partner = c(1,2,3,1,2,1,1,2),
kiss = as.factor(c("Yes", "No", "No", "No", "No", "Yes", "Yes", "No")))
id partner kiss
1 1 1 Yes
2 1 2 No
3 1 3 No
4 2 1 No
5 2 2 No
6 3 1 Yes
7 4 1 Yes
8 4 2 No
我想在此数据集中创建一个新的因子变量,以指示该人(由“ id变量”指示)是否从未亲吻过任何“伙伴”。换句话说,如果该人与任何一个伴侣接吻,则新变量将显示“是”-他们从不与任何伴侣接吻。我认为这应该是这样的:
id partner kiss neverkiss
1 1 1 Yes No
2 1 2 No No
3 1 3 No No
4 2 1 No Yes
5 2 2 No Yes
6 3 1 Yes No
7 4 1 Yes No
8 4 2 No No
理想情况下,我想找到一种无需重新设置数据集即可创建此变量的方法。我也更喜欢使用dplyr软件包。到目前为止,我已经考虑过使用group_by和此包中的mutate函数来创建此变量。但是,我不确定我可以使用哪些辅助函数来创建我的特定变量。我对dplyr软件包之外的其他想法持开放态度,但这对我来说是头等奖。
这应该做
require(dplyr)
df <- data.frame(id = as.factor(c(1,1,1,2,2,3,4,4)),
partner = c(1,2,3,1,2,1,1,2),
kiss = as.factor(c("Yes", "No", "No", "No", "No", "Yes", "Yes", "No")))
df_new <- df %>%
group_by(id) %>%
mutate("neverkiss" = {if (any(kiss == "Yes")) "No" else "Yes"})
df_new
如果新列应包含因素,则必须ungroup
首先
df_new <- df %>%
group_by(id) %>%
mutate("neverkiss" = {if (any(kiss == "Yes")) "No" else "Yes"}) %>%
ungroup() %>%
mutate("neverkiss" = as.factor(neverkiss))
class(df_new$neverkiss)
[1] "factor"
原因是因素无法结合:
a <- as.factor(c("Yes", "Yes", "Yes"))
b <- as.factor(c("No", "No", "No"))
c(a, b) # meaningless
由于分组仍在进行中,mutate
因此基本上将向量neverkiss
构建为每个id
(组)向量的组合,这将导致向量仅为一个级别(在这种情况下为“否”)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句