R 我们如何将函数应用于数据帧中每组连续匹配行的列向量
例如,使用列1作为匹配标准,让我们调用R 我们如何将函数应用于数据帧中每组连续匹配行的列向量,r,R,例如,使用列1作为匹配标准,让我们调用为列2向量v复制(长度(v),总和(v)),该向量包含来自数据帧A的连续和匹配行(包括大小为1的行集) 该操作可以返回一个向量或向量列表,我们可以使用unlist()将其强制为一个向量。下面是一个使用数据的简单解决方案。table——这仅仅是因为它内置了rleid函数,而且它处理因子 library(data.table) setDT(df)[, res := sum(v), by = rleid(A)] df # A v res # 1: a 12
为列2向量v
复制(长度(v),总和(v))
,该向量包含来自数据帧A
的连续和匹配行(包括大小为1的行集)
该操作可以返回一个向量或向量列表,我们可以使用
unlist()
将其强制为一个向量。下面是一个使用数据的简单解决方案。table
——这仅仅是因为它内置了rleid
函数,而且它处理因子
library(data.table)
setDT(df)[, res := sum(v), by = rleid(A)]
df
# A v res
# 1: a 12 55
# 2: a 43 55
# 3: b 8 8
# 4: a 4 4
# 5: b 12 12
# 6: c 5 14
# 7: c 9 14
# 8: d 21 21
如果我们想要基本R,我们可以重新创建rleid
,或者将cumsum
与ave
with(df, ave(v, cumsum(c(TRUE, head(A, -1) != tail(A, -1))), FUN = sum))
# [1] 55 55 8 4 12 14 14 21
这里有一个使用data.table
的简单解决方案,这仅仅是因为它内置了rleid
函数,而且它处理因子
library(data.table)
setDT(df)[, res := sum(v), by = rleid(A)]
df
# A v res
# 1: a 12 55
# 2: a 43 55
# 3: b 8 8
# 4: a 4 4
# 5: b 12 12
# 6: c 5 14
# 7: c 9 14
# 8: d 21 21
如果我们想要基本R,我们可以重新创建rleid
,或者将cumsum
与ave
with(df, ave(v, cumsum(c(TRUE, head(A, -1) != tail(A, -1))), FUN = sum))
# [1] 55 55 8 4 12 14 14 21
这里有一个使用dplyr
library(dplyr)
df1 %>%
group_by(A1 = cumsum(A!= dplyr::lag(A, default=A[1]))) %>%
mutate(res = sum(v)) %>%
ungroup() %>%
select(-A1)
# A v res
# (chr) (int) (int)
#1 a 12 55
#2 a 43 55
#3 b 8 8
#4 a 4 4
#5 b 12 12
#6 c 5 14
#7 c 9 14
#8 d 21 21
这里有一个使用dplyr
library(dplyr)
df1 %>%
group_by(A1 = cumsum(A!= dplyr::lag(A, default=A[1]))) %>%
mutate(res = sum(v)) %>%
ungroup() %>%
select(-A1)
# A v res
# (chr) (int) (int)
#1 a 12 55
#2 a 43 55
#3 b 8 8
#4 a 4 4
#5 b 12 12
#6 c 5 14
#7 c 9 14
#8 d 21 21
到目前为止,我一直避免尝试data.table。在我看的地方似乎出现了一些问题——也许我应该给它一个机会。我将稍等片刻,看看是否有人发布了非data.table解决方案。那么,您使用的是什么<代码>dplyr
?基尔?另外,A
Afactor
还是character
类?到目前为止,我使用了dplyr
和base R。我对data.table的担心是它更改了数据结构,因此无法使用base R语法。或者这是一种误解<代码>A
是字符类型数据。我想它可能很容易被强制为因子(通常不使用因子)?好的,添加了base R。将在一瞬间添加dplyr
,我用dplyr的lead
/lag
尝试过这一点,但它不断返回许多奇怪的错误。在您的情况下,如果愿意,您可以将data.table
中的rleid
与dplyr中的groupby
和mutate
组合起来。或者,您可以使用rleid之类的东西编写自己的rleid
函数。到目前为止,我一直避免尝试data.table。在我看的地方似乎出现了一些问题——也许我应该给它一个机会。我将稍等片刻,看看是否有人发布了非data.table解决方案。那么,您使用的是什么<代码>dplyr
?基尔?另外,A
Afactor
还是character
类?到目前为止,我使用了dplyr
和base R。我对data.table的担心是它更改了数据结构,因此无法使用base R语法。或者这是一种误解<代码>A是字符类型数据。我想它可能很容易被强制为因子(通常不使用因子)?好的,添加了base R。将在一瞬间添加dplyr
,我用dplyr的lead
/lag
尝试过这一点,但它不断返回许多奇怪的错误。在您的情况下,如果愿意,您可以将data.table
中的rleid
与dplyr中的groupby
和mutate
组合起来。或者您可以使用类似于rleid hmmm的东西编写自己的rleid
函数。。。因此,在较新的版本中,您现在需要明确指定dplyr::lag
。。。我想知道为什么我总是出错…@DavidArenburg它只有在使用默认值时才会出现问题。我想不然的话,它叫基地拉格姆。。。因此,在较新的版本中,您现在需要明确指定dplyr::lag
。。。我想知道为什么我总是出错…@DavidArenburg它只有在使用默认值时才会出现问题。我认为,否则的话,这就是所谓的基础R滞后