我有一个长格式的分层数据框,其中每一行代表关系,其中许多可以属于一个人.以下是小示例数据集的代码:
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
(组)的矢量组合,这导致仅一个级别的矢量(在这种情况下为"否").