当前位置:  开发笔记 > 编程语言 > 正文

在dplyr包中使用group_by和mutate通过id变量创建新的factor因子

如何解决《在dplyr包中使用group_by和mutate通过id变量创建新的factor因子》经验,为你挑选了1个好方法。

我有一个长格式的分层数据框,其中每一行代表关系,其中许多可以属于一个人.以下是小示例数据集的代码:

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包之外的其他想法持开放态度,但这对我来说是一等奖.



1> Manuel R..:

这应该做到这一点

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(组)的矢量组合,这导致仅一个级别的矢量(在这种情况下为"否").

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有