R 基于多行值计算新列
我有一个R 基于多行值计算新列,r,dataframe,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),该值对于团队的所有成员都相同,但取决于团队中的人员。 例如,在团队中同时拥有M和F的团队B将拥有Team
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中做到这一点。我们可以使用
数据。table
。我们将“data.frame”转换为“data.table”(setDT(df1)
),按“Team”分组,如果“Gender”的唯一元素长度大于1(uniqueN(Gender)>1
),我们将其称为“Mixed”或否则
我们将字符串“Only”与“Gender”的第一个元素粘贴在一起(或unique
元素的'Gender')。请注意,如果“团队”只有'F',这将给出'OnlyF'
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
。在这里,您可以将每个团队级别的子表分组,然后使用mutate
添加带有所需输出的列-“teamtype”
library(dplyr)
data %>% group_by(Team) %>%
mutate(teamtype = ifelse(all(Gender=="M"), "OnlyM", "Mixed"))
Source: local data frame [6 x 5]
Groups: Team [3]
Name Age Gender Team teamtype
(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
另一种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不同。如果是全女性团队,我们应该在“仅”上粘贴性别
基本R
在base R
中,它本质上是相同的:
with(df, ave(Gender, Team,
FUN=function(x) {
ifelse(length(unique(x)) == 2, "Mixed", paste0("Only", x))}))
当一组中只有“女性”时,您的方法似乎是正确的。顺便说一句,您可以使用n_distinct
fromdplyr
替换长度(unique
为什么需要unique(性别)
?如果n_distinct(性别)<2
将只有一个性别
类型否?没有它就可以工作。我将它放在那里以确保只有一个值。但不需要它。谢谢,使用dplyr对我来说非常适合!(获取TeamType值的技术对我来说并不重要,因为我真正的问题与此不同。但现在我有了一切可以解决的东西).谢谢你的帮助!我不知道为什么这一个没有像其他人一样获得更多的选票。Peeps需要滚动@RichardScriben当某个特定团队的性别仅为“F”时会有什么结果?谢谢你的帮助@akrun。这对我也有用,但我觉得dplyr
方法更直观。我还是投票支持你。