Подтвердить что ты не робот

Объединение повторяющихся строк

У меня есть кадр данных, где один столбец - это имена видов, а второй столбец - значения численности. Из-за процедуры отбора проб некоторые виды появляются более одного раза (т.е. В нем имеется более одной строки с видами X). Я хотел бы объединить эти записи и суммировать их численность.

Например, с учетом этого кадра данных:

set.seed(6)
df=data.frame(
  x=c("sp1","sp2","sp3","sp3","sp4","sp2","sp3"),
  y=rpois(7,2)); df

который производит:

    x y
1 sp1 2
2 sp2 4
3 sp3 1
4 sp3 1
5 sp4 3
6 sp2 5
7 sp3 5

Я хотел бы вместо этого произвести:

    x y
1 sp1 2    
2 sp2 9     (5+4)
3 sp3 7     (5+1+1)
5 sp4 3

Заранее благодарим за любую помощь, которую вы можете предоставить!

4b9b3361

Ответ 1

Это работает:

library(plyr)
ddply(df,"x",numcolwise(sum))

в словах: (1) разделение кадра данных df на столбец "x"; (2) для каждого фрагмента, возьмите сумму каждого столбца с числовой оценкой; (3) верните результаты обратно в один кадр данных. (dd в ddply означает "взять в качестве входного кадра d ata, вернуть d ata frame" )

Другой, возможно более понятный подход:

aggregate(y~x,data=df,FUN=sum)

См. быстрый/элегантный способ построения сводной таблицы средних/дисперсий для связанного (немного более сложного) вопроса.

Ответ 2

Просто как aggregate:

aggregate(df['y'], by=df['x'], sum)

Ответ 3

A data.table решение для эффективности времени и памяти

library(data.table)
DT <- as.data.table(df)
# which columns are numeric 
numeric_cols <- which(sapply(DT, is.numeric))
DT[, lapply(.SD, sum), by = x, .SDcols = numeric_cols]

Или, в вашем случае, учитывая, что вы знаете, что существует только 1 столбец y, который вы хотите суммировать по

DT[, list(y=sum(y)),by=x]

Ответ 4

> tapply(df$y, df$x, sum)
sp1 sp2 sp3 sp4 
  2   9   7   3 

если он должен быть ответом data.frame Ben, отлично работает. или вы можете принудительно выполнить вывод.

out <- tapply(df$y, df$x, sum)
>     data.frame(x=names(out), y=out, row.names=NULL)
    x y
1 sp1 2
2 sp2 9
3 sp3 7
4 sp4 3

Ответ 5

A dplyr решение:

library(dplyr)
df %>% group_by(x) %>% summarise(y = sum(y))

Ответ 6

A MWE, чтобы проверить, действительно ли будет работать формула для оценки второй переменной (то есть здесь "Z" и в дополнение к "X" будет работать:

example = data.frame(X=c("x"),Z=c("a"),Y=c(1), stringsAsFactors=F)
newrow = c("y","b",1)
example <- rbind(example, newrow)
newrow = c("z","a",0.5)
example <- rbind(example, newrow)
newrow = c("x","b",1)
example <- rbind(example, newrow)
newrow = c("x","b",2)
example <- rbind(example, newrow)
newrow = c("y","b",10)
example <- rbind(example, newrow)
example$X = as.factor(example$X)
example$Z = as.factor(example$Z)
example$Y = as.numeric(example$Y)
example_agg <- aggregate(Y~X+Z,data=example,FUN=sum)