时间:2017-03-28 18:52:06

标签: r database data-manipulation

说我有以下数据集:

PlotName<- c(A,B,B,C,D,E,F,F,F)
NewValue<- c(1,2,1,3,0,0,2,1,3)
OldValue<- c(3,3,1,2,1,3,0,3,1)

我想对NewValue中重复的元素的OldValuePlotName值求和,在相同的重复元素(字母)处消除。例如,对于&#39; B&#39; NewValue = 2 + 1 = 3,OldValue = 3 + 1 = 4

即:

PlotName<- c(A,B,C,D,E,F)
NewValue<- c(1,3,3,0,0,6)
OldValue<- c(3,4,2,1,3,4)

我可以使用PlotName中的重复值来过滤行(例如使用dplyr),然后单独对这些值求和,但我正在寻找一种更快的方法来处理具有许多重复值的大型数据集。

3 个答案:

答案 0 :(得分:2)

我们可以在创建data.frame

之后通过任何一个group by操作执行此操作
aggregate(.~PlotName, data.frame(NewValue, OldValue, PlotName), FUN = sum)

或另一个选项是rowsum

rowsum(cbind(NewValue, OldValue), PlotName)
#   NewValue OldValue
#A        1        3
#B        3        4
#C        3        2
#D        0        1
#E        0        3
#F        6        4

更快的选择是转换为data.table并使用data.table方法

library(data.table)
data.table(NewValue, OldValue, PlotName)[, lapply(.SD, sum), PlotName] 

答案 1 :(得分:2)

使用dplyr

library(dplyr)

data.frame(PlotName, NewValue, OldValue) %>% 
  group_by(PlotName) %>% 
  summarise_all(sum)

# # A tibble: 6 × 3
#   PlotName NewValue OldValue
#     <fctr>    <dbl>    <dbl>
# 1        A        1        3
# 2        B        3        4
# 3        C        3        2
# 4        D        0        1
# 5        E        0        3
# 6        F        6        4

答案 2 :(得分:1)

sapply(split(OldValue, PlotName), sum)
#A B C D E F 
#3 4 2 1 3 4 
sapply(split(NewValue, PlotName), sum)
#A B C D E F 
#1 3 3 0 0 6