3

我有一个数据集在第 1 列中有重复的名称,然后是 3 个其他数字列。

我想将重复名称的行合并到一列中,并对列中的 2 列进行求和,而将另一列单独保留。有没有一种简单的方法可以做到这一点?我一直在尝试用 sapply 和 lapply 来解决这个问题,并且在这里阅读了很多问答,但似乎找不到解决方案

Name <- c("Jeff", "Hank", "Tom", "Jeff", "Hank", "Jeff",
                       "Jeff", "Bill", "Mark")
data.Point.1 <- c(3,4,3,3,4,3,3,6,2)
data.Point.2 <- c(6,9,2,5,7,4,8,2,9)
data.Point.3 <- c(2,2,8,6,4,3,3,3,1)
data <- data.frame(Name, data.Point.1, data.Point.2, data.Point.3)

数据如下所示:

  Name data.Point.1 data.Point.2 data.Point.3
1 Jeff            3            6            2
2 Hank            4            9            2
3  Tom            3            2            8
4 Jeff            3            5            6
5 Hank            4            7            4
6 Jeff            3            4            3
7 Jeff            3            8            3
8 Bill            6            2            3
9 Mark            2            9            1

我想让它看起来像这样(将第 3 列和第 4 列相加并单独留下第 1 列。我希望它看起来像这样:

  Name data.Point.1 data.Point.2 data.Point.3
1 Jeff            3           23           14
2 Hank            4           16            6
3  Tom            3            2            8
8 Bill            6            2            3
9 Mark            2            9            1

任何帮助都会很棒。谢谢!

4

3 回答 3

3

另一个更直接的解决方案是使用库dplyr

library(dplyr)
data <- data %>% group_by(Name, data.Point.1) %>%  # group the columns you want to "leave alone"
  summarize(data.Point.2=sum(data.Point.2), data.Point.3=sum(data.Point.3)) # sum columns 3 and 4

如果你想总结所有其他列,除了那些你想“不理会”的列,然后替换summarize(data.Point.2=sum(data.Point.2), data.Point.3=sum(data.Point.3))summarise_each(funs(sum))

于 2015-03-18T19:22:02.053 回答
1

我会这样做使用data.table

setDT(data)[, c(data.Point.1 = data.Point.1[1L], 
                lapply(.SD, sum)), by=Name, 
                .SDcols = -"data.Point.1"]
#    Name data.Point.1 data.Point.2 data.Point.3
# 1: Jeff            3           23           14
# 2: Hank            3           16            6
# 3:  Tom            3            2            8
# 4: Bill            3            2            3
# 5: Mark            3            9            1

我们按 分组Name,对于每个组,获取 的第一个元素data.Point.1,对于其余的列,我们sum通过使用基函数计算lapply并遍历 的列.SD,它代表数据的子集。中的列.SD由 提供.SDcols,我们将其删除data.Point.1,以便将所有其他列提供给.SD

查看HTML 小插曲以获取详细信息。

于 2015-03-18T21:09:03.713 回答
0

你可以试试

library(data.table)
setDT(data)[, list(data.Point.1=data.Point.1[1L],
    data.Point.2=sum(data.Point.2), data.Point.3=sum(data.Point.3)), by=Name]
#    Name data.Point.1 data.Point.2 data.Point.3
#1: Jeff            3           23           14
#2: Hank            4           16            6
#3:  Tom            3            2            8
#4: Bill            6            2            3
#5: Mark            2            9            1

或使用base R

data$Name <- factor(data$Name, levels=unique(data$Name))
res <- do.call(rbind,lapply(split(data, data$Name), function(x) {
                x[3:4] <- colSums(x[3:4])
                x[1,]} ))

或者使用dplyr,您可以使用summarise_each来应用需要应用于多个列的函数,以及cbind单个列的“summarise”输出的输出

library(dplyr)
res1 <- data %>%
            group_by(Name) %>% 
            summarise(data.Point.1=data.Point.1[1L])

res2 <- data %>%
            group_by(Name) %>% 
                          summarise_each(funs(sum), 3:4)
cbind(res1, res2[-1])
#   Name data.Point.1 data.Point.2 data.Point.3
#1 Jeff            3           23           14
#2 Hank            4           16            6
#3  Tom            3            2            8
#4 Bill            6            2            3
#5 Mark            2            9            1

编辑

创建的数据和最初显示的数据在原始帖子中有所不同。在对 OP 的帖子进行编辑后(@dimitris_ps),您可以通过在代码中替换group_by(Name)为来获得预期的结果。group_by(Name, data.Point.1)res2 <- ..

于 2015-03-18T18:51:52.550 回答