基于多行值计算新列

时间:2015-10-10 15:06:26

标签: r dataframe

我的data.frame看起来像这样:

Name  Age Gender Team  
John  18    M     A 
Luke  75    M     B  
Dean  20    M     C  
Zoe   34    F     B  
Chloe 12    F     B  
Erik  56    M     A  

我想计算一个新值(TeamType),该值对于团队的所有成员都是相同的,但取决于团队中的人员。
例如,团队中同时拥有MF的团队B将拥有TeamType=Mixed,而团队C和A将为OnlyM,如下所示:

Name  Age Gender Team TeamType
John  18    M     A    OnlyM
Luke  75    M     B    Mixed  
Dean  20    M     C    OnlyM
Zoe   34    F     B    Mixed
Chloe 12    F     B    Mixed
Erik  56    M     A    OnlyM

这在Python或许多其他传统语言中很容易做到,但我无法弄清楚如何在R中做到这一点。

3 个答案:

答案 0 :(得分:7)

我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(df1)),按'团队'进行转换,if'Gender'的唯一元素长度大于1({{1} }})我们将其称为“混合”或uniqueN(Gender)>1我们else字符串'Only',其中第一个元素为'Gender'(或'Gender'的paste元素)。请注意,如果“团队”只有“F”,则会显示“OnlyF”。

unique

答案 1 :(得分:6)

另一种dplyr方法:

library(dplyr)
df %>% group_by(Team) %>% 
  mutate(newcol=ifelse(n_distinct(Gender) == 2, "Mixed", paste0("Only", Gender)))
#Source: local data frame [6 x 5]
#Groups: Team [3]
#
#    Name   Age Gender   Team newcol
#  (fctr) (int) (fctr) (fctr)  (chr)
#1   John    18      M      A  OnlyM
#2   Luke    75      M      B  Mixed
#3   Dean    20      M      C  OnlyM
#4    Zoe    34      F      B  Mixed
#5  Chloe    12      F      B  Mixed
#6   Erik    56      M      A  OnlyM

我和jeremycg的路线不同。在所有女性团队的情况下,我们应该粘贴" Only"存在性别。

基础R

base R中,它基本上是相同的:

with(df, ave(Gender, Team, 
             FUN=function(x) {
               ifelse(length(unique(x)) == 2, "Mixed", paste0("Only", x))}))

答案 2 :(得分:2)

您可以使用library(data.table)#v1.9.6+ setDT(df1)[, TeamType:=if(uniqueN(Gender)>1) 'Mixed' else paste0('Only',Gender[1L]) , by=Team] df1 # Name Age Gender Team TeamType #1: John 18 M A OnlyM #2: Luke 75 M B Mixed #3: Dean 20 M C OnlyM #4: Zoe 34 F B Mixed #5: Chloe 12 F B Mixed #6: Erik 56 M A OnlyM 。在这里,您可以分组到每个级别的团队的子表,然后使用dplyr添加一个列 - “teamtype”,其中包含所需的输出。

mutate