我的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
),该值对于团队的所有成员都是相同的,但取决于团队中的人员。
例如,团队中同时拥有M
和F
的团队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中做到这一点。
答案 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