R 如何在动态长列表中设置名称
鉴于以下数据:R 如何在动态长列表中设置名称,r,list,dplyr,tidyr,R,List,Dplyr,Tidyr,鉴于以下数据: test = data.frame(x = c(NA,1,1,2,3,4), y = c(NA,1,2,3,4,4)) 我想执行一些计算并将其存储为新列。但是,计算可能会导致列的数量可变。例如,假设我希望为每行存储包含每行最小值的列的列索引。例如,在第1行中,两列都包含最小值,因此我需要创建两列 使用tidyverse方法,我知道在将函数作为列表传递时可以使用set\u names参数。但当我不知道我的计算将创建多少列时,这就不起作用了。另见
test = data.frame(x = c(NA,1,1,2,3,4),
y = c(NA,1,2,3,4,4))
我想执行一些计算并将其存储为新列。但是,计算可能会导致列的数量可变。例如,假设我希望为每行存储包含每行最小值的列的列索引。例如,在第1行中,两列都包含最小值,因此我需要创建两列
使用tidyverse方法,我知道在将函数作为列表传递时可以使用set\u names
参数。但当我不知道我的计算将创建多少列时,这就不起作用了。另见此处:
我的计算方法:
library(tidyverse)
test %>%
rowwise() %>%
mutate(dist = min(c_across(everything())),
code = list(which(c_across(cols = c(everything(), -dist)) == dist))) %>%
ungroup() %>%
unnest_wider(code)
自动将未列出的列命名为“…1”和“…2”:
编辑以添加一个示例,其中一行仅包含缺失
编辑2:这是我当前的解决方案。但它真的很难看,需要中途停下来。这里的问题是,当我将所有内容放入一个管道中时,rename_with函数无法识别动态生成的“length_code”列
test2 <- test %>%
rowwise() %>%
mutate(dist = min(c_across(everything())),
code = list(which(c_across(cols = c(everything(), -dist)) == dist)),
length_code = length(code)) %>%
ungroup() %>%
unnest_wider(code) %>%
test3 <- test2 %>%
rename_with(.cols = starts_with("..."), .fn = ~paste0("code_", 1:max(test2$length_code)))
test2%
行()
变异(dist=min(c_横跨(一切())),
代码=列表(其中(c_跨(cols=c(everythings(),-dist))==dist)),
长度\代码=长度(代码))%>%
解组()%>%
unnest_加宽(代码)%%>%
测试3%
重命名_为(.cols=start_为(“…”).fn=~paste0(“代码”,1:max(test2$length_代码)))
其中:
# A tibble: 6 x 6
x y dist code_1 code_2 length_code
<dbl> <dbl> <dbl> <int> <int> <int>
1 NA NA NA NA NA 0
2 1 1 1 1 2 2
3 1 2 1 1 NA 1
4 2 3 2 1 NA 1
5 3 4 3 1 NA 1
6 4 4 4 1 2 2
#一个tible:6 x 6
x y距离码\u 1码\u 2长度码
1钠0钠
2 1 1 1 1 2 2
3 1 2 1 NA 1
4 2 3 2 1 NA 1
53431NA 1
6 4 4 4 1 2 2
您可以重命名列:“名称(测试)是的,我想避免以后重命名列。我的意思是,一种方法是计算最小值,然后计算每行的列表长度,并使用该信息创建名称向量。您是否尝试过名称\u sep=”_“
作为参数而不是修复
?确切位置在哪里?在unest或mutate(list(…)?unest\u更宽(code,names\u sep=“”)
test2 <- test %>%
rowwise() %>%
mutate(dist = min(c_across(everything())),
code = list(which(c_across(cols = c(everything(), -dist)) == dist)),
length_code = length(code)) %>%
ungroup() %>%
unnest_wider(code) %>%
test3 <- test2 %>%
rename_with(.cols = starts_with("..."), .fn = ~paste0("code_", 1:max(test2$length_code)))
# A tibble: 6 x 6
x y dist code_1 code_2 length_code
<dbl> <dbl> <dbl> <int> <int> <int>
1 NA NA NA NA NA 0
2 1 1 1 1 2 2
3 1 2 1 1 NA 1
4 2 3 2 1 NA 1
5 3 4 3 1 NA 1
6 4 4 4 1 2 2