通过将R中标记的行分组,将两列中的行相乘

通过将R中标记的行分组,将两列中的行相乘,r,dataframe,logic,R,Dataframe,Logic,我有一个dataframe DF,它有以下数据:;大约30万行 <DF A B C 1 2 0 2 5 0 4 5 2 4 7 0 7 8 0 9 7 -2 2 5 0 4 7 0 5 1 2 4 7 0 7 8 0 9 7 -2 2 5 0 4 7 0 5 1 2 使用dplyr library(dplyr) df <- df %>% mutate(ind = cumsum(C == 2)) %>% group_by(ind) %&

我有一个dataframe DF,它有以下数据:;大约30万行

<DF
A B C
1 2 0
2 5 0
4 5 2
4 7 0
7 8 0
9 7 -2
2 5 0
4 7 0
5 1 2
4 7 0
7 8 0
9 7 -2
2 5 0
4 7 0
5 1 2

使用
dplyr

library(dplyr)
df <- df %>% 
        mutate(ind = cumsum(C == 2)) %>% 
        group_by(ind) %>% 
        mutate(D = mean(A*B), D = replace(D, n() == 1, NA))
库(dplyr)
df%
突变(ind=cumsum(C==2))%>%
分组依据(ind)%>%
变异(D=平均值(A*B),D=替换(D,n()==1,NA))

这里有一个带有
数据表的选项。将'data.frame'转换为'data.table'(
setDT(DF)
),按逻辑向量的累积和(
C==2
)分组,我们得到
A*B
平均值
,并和
NA^(.N==1)生成的值相乘
.N==1
为等于1或不等于1的行数返回一个逻辑向量TRUE/FALSE,并使用
NA^
将其转换为NA/1),以便只有一个元素的所有组返回NA,而其他组具有
平均值(a*B)


欢迎来到SO,请在提问时更具体一点:您尝试了什么,您期望什么,等等。请始终尝试包含一个可复制的示例。另外,我如何将我在此处获得的D列添加到原始数据帧?它工作起来非常轻松!感谢您在@satos保存我的一天。当我再次尝试时,我得到一个错误:无法修改grouping变量。奇怪…你是否在其他地方包含
ind
变量?不。rm(ind)也给出了警告,该对象“ind”未找到嘿!谢谢@akrun,这是完美的!
library(dplyr)
df <- df %>% 
        mutate(ind = cumsum(C == 2)) %>% 
        group_by(ind) %>% 
        mutate(D = mean(A*B), D = replace(D, n() == 1, NA))
library(data.table)
setDT(DF)[,  D := NA^(.N==1)*mean(A*B) , .(grp = cumsum(C==2))]
DF
#    A B  C        D
# 1: 1 2  0  6.00000
# 2: 2 5  0  6.00000
# 3: 4 5  2 34.16667
# 4: 4 7  0 34.16667
# 5: 7 8  0 34.16667
# 6: 9 7 -2 34.16667
# 7: 2 5  0 34.16667
# 8: 4 7  0 34.16667
# 9: 5 1  2 31.66667
#10: 4 7  0 31.66667
#11: 7 8  0 31.66667
#12: 9 7 -2 31.66667
#13: 2 5  0 31.66667
#14: 4 7  0 31.66667
#15: 5 1  2       NA