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