dplyr 改变分组数据而不使用确切的列名
Posted
技术标签:
【中文标题】dplyr 改变分组数据而不使用确切的列名【英文标题】:dplyr mutate grouped data without using exact column name 【发布时间】:2021-06-13 05:10:17 【问题描述】:我正在尝试编写一个函数来处理多个相似的数据集,这里我想用上一次面试中同一主题获得的分数减去第二次面试中受试者获得的分数。在我要处理的所有数据集中,感兴趣的分数将存储在第二列中。为每个特定的数据集编写很简单,只需使用确切的列名,一切都会好起来的。
d <- a %>%
arrange(by_group=interview_date) %>%
dplyr::group_by(subjectkey) %>%
dplyr::mutate(score_change = colname_2nd-lag(colname_2nd))
但由于我需要一个可用于处理多个数据集的通用函数,因此我不能使用确切的列名。所以我尝试了3种方法,它们都只改变了最后一行
方法#1:
dplyr::mutate(score_change = dplyr::vars(2)-lag(dplyr::vars(2)))
方法#2: 感兴趣的数据集的第二列名称包含相同的字符串,所以我尝试了
dplyr::mutate(score_change = dplyr::vars(matches('string'))-lag(dplyr::vars(matches('string'))))
上述两种方法的错误信息将是
Error in dplyr::vars(2) - lag(dplyr::vars(2)) :
non-numeric argument to binary operator
方法#3:
dplyr::mutate(score_change = .[[2]]-lag(.[[2]]))
错误信息:
Error: Column `score_change` must be length 2 (the group size) or one, not 10880
10880 是我的示例数据集的行号,所以看起来 group_by 在这种方法中不起作用
有谁知道如何使函数以所需的方式执行?
【问题讨论】:
data.frames 是否总是以相同的列顺序导入?然后,您可以在每种情况下将 data.frames 命名为相同,例如col1,领先,滞后 是的,这可能是一种方法,但我仍然想学习如何在不使用确切列名的情况下改变分组数据。这次我可以通过重命名列来做到这一点,但下次我可能无法这样做 您是否知道每种情况下第二列的名称,但它会有所不同?还是您只知道要更改第二列? 我知道第二列的名称,但它会有所不同。但我也想知道如何处理你描述的第二种情况 【参考方案1】:如果您想使用列名的位置,请使用cur_data()[[2]]
来引用数据框的第二列。
library(dplyr)
d <- a %>%
arrange(interview_date) %>%
dplyr::group_by(subjectkey) %>%
dplyr::mutate(score_change = cur_data()[[2]]-lag(cur_data()[[2]]))
另请注意,cur_data()
不计算分组列,因此如果 subjectkey
是数据中的第一列,colname_2nd
是第二列,则您可能需要在 group_by
时使用 cur_data()[[1]]
。
【讨论】:
cur_data() 是什么?我收到错误消息说没有这样的功能cur_data()
在dplyr
1.0.0 或更高版本中可用。您需要更新您的 dplyr
包。运行install.packages('dplyr')
我试过dplyr::group_by(cur_data()[[1]]) %>% dplyr::mutate(score_change = cur_data()[[2]]-lag(cur_data()[[2]]))
现在它可以工作了,但是结果中还添加了一个名为cur_data()[[1]]
的新列,并且该列的值与subjectkey完全相同,知道为什么会发生这种情况?
是的,如果您将cur_data()
包含在group_by
中,它将创建一个带有cur_data()
的列。如果不需要,您可以在之后删除它们。 %>% ungroup %>% select(-1)
或 ungroup %>% select(-contains('cur_data'))
之一应该可以工作。以上是关于dplyr 改变分组数据而不使用确切的列名的主要内容,如果未能解决你的问题,请参考以下文章