R 按名称折叠数据帧,其中整数列求和,因子列粘贴

R 按名称折叠数据帧,其中整数列求和,因子列粘贴,r,R,我试图通过包含补充整数列和因子列的唯一名称来折叠数据帧。整数列需要求和以获得唯一的“Name”值,而factor列需要将所有值彼此并排粘贴,如下所示: Name Number Location RUDU 6 SiteA RUDU 4 SiteB YHBL 50 SiteA YHBL 60

我试图通过包含补充整数列和因子列的唯一名称来折叠数据帧。整数列需要求和以获得唯一的“Name”值,而factor列需要将所有值彼此并排粘贴,如下所示:

Name        Number         Location
RUDU          6               SiteA
RUDU          4               SiteB
YHBL          50              SiteA
YHBL          60              SiteB
按名称折叠为:

Name        Number         Location
RUDU          10              SiteA,SiteB
YHBL          110             SiteA,SiteB

我已经使用了ddplyr,它适用于整数部分,但是我不知道如何聚合我请求的因子部分。

这里有一种可能的
数据表
方法

library(data.table)
setDT(df)[, list(Mumber = sum(Number), Location = toString(Location)), by = Name]
#    Name Mumber     Location
# 1: RUDU     10 SiteA, SiteB
# 2: YHBL    110 SiteA, SiteB
正如您提到的,这里有一个可能的解决方案

library(dplyr)
df %>%
  group_by(Name) %>%
  summarise(
            Mumber = sum(Number), 
            Location = toString(Location)
            )

# Source: local data table [2 x 3]
# 
#   Name Mumber     Location
# 1 RUDU     10 SiteA, SiteB
# 2 YHBL    110 SiteA, SiteB
dplyr

library(dplyr)
d %>% 
    group_by_(~Name) %>% 
    summarize_(Number=~sum(Number), Location=~paste(Location, collapse=','))
基本R

merge(aggregate(Number ~ Name, data=d, FUN=sum), aggregate(Location ~ Name, data=d, FUN=paste, collapse=','))

还有两种方法可供参考

功能:tapply()

函数:by()

数据

# df1 <- read.table(text='Name        Number         Location
# RUDU          6               SiteA
# RUDU          4               SiteB
# YHBL          50              SiteA
# YHBL          60              SiteB', header=T)

#df1我不确定代码会是什么样子,但要激发一个想法,请尝试将其分为两个过程。将数字相加并另存为变量,然后运行
newDf加上一个
toString
setDT(df)[,list(Number=sum(Number),Location=(Location)),by=Name]
。没有
toString
@plafort的解决方案,它会将
Location
转换为列表。我明白了。在大多数情况下,将其作为向量使用会更好。
data.frame(cbind(
  Number = with(df1, by(Number, Name, sum)),
  Location =  with(df1, by(Location, Name, toString))
  )
)

#      Number     Location
# RUDU     10 SiteA, SiteB
# YHBL    110 SiteA, SiteB
# df1 <- read.table(text='Name        Number         Location
# RUDU          6               SiteA
# RUDU          4               SiteB
# YHBL          50              SiteA
# YHBL          60              SiteB', header=T)