在下面的DATA
表格中,我列出了属于三个组A
,B
和C
的数字列表。我需要创建另一列NAYSA
,其中包含相对于组中第一个数字的两个数字的总和。并非所有组在我的数据集中都有多个数字。希望RESULT
表说明我需要做什么。
请注意,NAYSA
列中每个组的第一行与YRS
表中的DATA
列中的第一行相同。但是,NAYSA
列中的第3行是YRS
列中第2行和第3行的值的总和。同样,NAYSA
中的第5行和第6行是第4行和第5行的值之和。分别在YRS
列中的4和6。
我更喜欢使用dplyr
的解决方案,但我愿意接受其他建议。提前谢谢。
DATA = data.frame(IND = c("A","B","B","C","C","C"),
YRS = c("1","10","20","100","1","10"))
RESULT = data.frame(IND = c("A","B","B","C","C","C"),
YRS = c("1","10","20","100","1","10"),
NAYSA = c(1, 10, 30, 100, 101, 110))
答案 0 :(得分:2)
编辑以匹配所需的输出,您可以使用mutate
,如下所示:
DATA$YRS <- as.integer(as.character(DATA$YRS))
DATA %>% group_by(IND) %>% mutate(NAYSA = ifelse(row_number() == 1, YRS, YRS + YRS[1]))
Source: local data frame [6 x 3]
Groups: IND [3]
IND YRS NAYSA
(fctr) (int) (int)
1 A 1 1
2 B 10 10
3 B 20 30
4 C 100 100
5 C 1 101
6 C 10 111
BTW - 我必须先将YRS转换为整数,因为您在数据集中创建了该列作为字符向量。当然,如果此列中的原始数据已经是数字格式,则不需要此步骤。
答案 1 :(得分:1)
此dplyr
解决方案符合您的预期结果:
library(dplyr)
RESULT <- DATA %>%
# set the grouping factor
group_by(IND) %>%
# convert YRS to numeric and generate new variable by adding the
# first value on the YRS column to YRS on the current row, unless
# we are on the first row, in that case just keep the current value
# of YRS
mutate(YRS = as.numeric(as.character(YRS)),
NAYSA = ifelse(row_number() == 1, YRS, first(YRS) + YRS))
> RESULT
Source: local data frame [6 x 3]
Groups: IND [3]
IND YRS NAYSA
(fctr) (dbl) (dbl)
1 A 1 1
2 B 10 10
3 B 20 30
4 C 100 100
5 C 1 101
6 C 10 110
此解决方案的一个警告是,它与您预期结果中的数据类型不匹配,但我不确定您示例中的数据类型是否符合您的要求。
我意识到这个答案与@Gopala提供的答案非常相似,但我认为使用first
而不是索引会使代码更清晰,而且,我使用as.numeric
代替{{1因为我觉得这是一种更通用的方法。
我希望你觉得这个解决方案很有用。