gpt4 book ai didi

r - dplyr + "meta"-列 : when a column contains names of other columns to use instead of the data

转载 作者:行者123 更新时间:2023-12-04 11:04:14 24 4
gpt4 key购买 nike

我想知道以下问题在 dplyr 中是否有一个优雅的解决方案。

为了提供一个简单的可重现示例,请考虑以下 data.frame:

df <- data.frame( a=1:5, b=2:6, c=3:7,
ref=c("a","a","b","b","c"),
stringsAsFactors = FALSE )

这里 abc 是常规数值变量,而 ref 是为了引用 ,该列是该观察 的“主要”值。例如:
  a b c ref
1 1 2 3 a
2 2 3 4 a
3 3 4 5 b
4 4 5 6 b
5 5 6 7 c

例如,对于观察 3, ref==b 和列 b 包含主值。而对于观察 1, ref==a 和列 a 包含主要值。

有了这个 data.frame,问题是使用 dplyr 为每个观察创建带有 main 值的新列。
  a b c ref main
1 1 2 3 a 1
2 2 3 4 a 2
3 3 4 5 b 4
4 4 5 6 b 5
5 5 6 7 c 7

我可能需要为此使用 dplyr,因为这个操作是更长的 dplyr %>% 数据转换链的一部分。

最佳答案

这是一种简单、快速的方法,可以让您坚持使用 dplyr 链接:

require(data.table)
df %>% setDT %>% .[,main:=get(ref),by=ref]
# a b c ref main
# 1: 1 2 3 a 1
# 2: 2 3 4 a 2
# 3: 3 4 5 b 4
# 4: 4 5 6 b 5
# 5: 5 6 7 c 7

感谢@akrun 提出了最快的方法和基准测试来展示它的想法(见他的回答)。
setDT 修改了 df 的类,因此您不必在以后的链中再次转换为 data.table

转换应该适用于链中的任何 future 代码,但 dplyrdata.table 都在积极开发中,所以为了安全起见,可以改为使用
df %>% data.table %>% .[,main:=get(ref),by=ref]

关于r - dplyr + "meta"-列 : when a column contains names of other columns to use instead of the data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30271164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com