R 我们如何将函数应用于数据帧中每组连续匹配行的列向量

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

例如,使用列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  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
A
factor
还是
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
A
factor
还是
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滞后