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
from
dplyr
替换
长度(unique
为什么需要
unique(性别)
?如果
n_distinct(性别)<2
将只有一个
性别
类型否?没有它就可以工作。我将它放在那里以确保只有一个值。但不需要它。谢谢,使用
dplyr对我来说非常适合!(获取TeamType值的技术对我来说并不重要,因为我真正的问题与此不同。但现在我有了一切可以解决的东西).谢谢你的帮助!我不知道为什么这一个没有像其他人一样获得更多的选票。Peeps需要滚动@RichardScriben当某个特定团队的性别仅为“F”时会有什么结果?谢谢你的帮助@akrun。这对我也有用,但我觉得
dplyr
方法更直观。我还是投票支持你。