r - 遍历列表时获取列表的元素编号

标签 r list tidyverse purrr

我有以下结构的列表,
myList <- replicate(5, data.frame(id = 1:10, mean = runif(10)), simplify =F)
我想通过合并来减少它

myList %>% reduce(function(x, y) merge(x, y, by = 'id'))

但是,这会导致以下列名:
    id     mean.x    mean.y    mean.x    mean.y       mean

虽然我想要类似的东西
 id     mean1    mean2    mean3    mean4       mean5

其中数字基于myList的顺序.

显然我可以迭代 1:length(myList) ,但我觉得这个解决方案不优雅。另一种选择是在减少函数中引入检查,但这会导致对列表中的每个元素进行新的线性时间搜索,所以我认为它不是很有效。

有没有另一种方法来实现这一目标?

最佳答案

新答案:

使用 rbindlistdcast来自 data.table -包裹:

library(data.table)
mydata <- rbindlist(myList, idcol = 'df')
dcast(mydata, id ~ paste0('mean',df), value.var = 'mean')

或者使用 tidyverse 包:
library(dplyr)
library(tidyr)
myList %>% 
  bind_rows(., .id = 'df') %>% 
  spread(df, mean) %>% 
  rename_at(-1, funs(paste0('mean',.)))

两者都给出(显示 data.table -output):

    id     mean1       mean2     mean3      mean4      mean5
 1:  1 0.6937674 0.005642891 0.4155868 0.74184186 0.54513885
 2:  2 0.3602352 0.569412043 0.8018570 0.29177043 0.34521060
 3:  3 0.6353133 0.512876032 0.8711914 0.44660086 0.16338451
 4:  4 0.2106574 0.555638598 0.8240744 0.37495213 0.57443740
 5:  5 0.9530160 0.059930577 0.0930678 0.39862717 0.91568414
 6:  6 0.3723244 0.598526326 0.4970844 0.01978011 0.07832631
 7:  7 0.2923137 0.712971846 0.3805590 0.25676592 0.11682605
 8:  8 0.6208868 0.426853621 0.5533876 0.64054247 0.78949419
 9:  9 0.9032609 0.274705843 0.3525957 0.46994429 0.32883110
10: 10 0.9707088 0.351394642 0.1089803 0.97969335 0.77791085


当有duplicates in id myList 中的一个或多个数据帧中,你必须适应dcast -步至dcast(mydata, id + rowid(id,df) ~ paste0('mean',df), value.var = 'mean')以获得正确的结果。检查以下示例以查看结果:
myList <- replicate(5, data.frame(id = sample(1:10, 10, TRUE), mean = runif(10)), simplify = FALSE)
mydata <- rbindlist(myList, idcol = 'df')
dcast(mydata, id + rowid(id,df) ~ paste0('mean',df), value.var = 'mean')

这也适用于 id 中没有重复项时.
tidyverse -code 然后必须适应:
myList %>% 
  bind_rows(., .id = 'df') %>% 
  group_by(df, id) %>% 
  mutate(ri = row_number()) %>% 
  ungroup() %>% 
  spread(df, mean) %>% 
  rename_at(3:7, funs(paste0('mean',.)))

旧答案(仍然有效):

一个可能的解决方案:
# option 1
myList <- mapply(function(x,y) {names(x)[2] = paste0('mean',y); x}, myList, 1:length(myList), SIMPLIFY = FALSE)
Reduce(function(x, y) merge(x, y, by = 'id'), myList)

# option 2 (quite similar to @zx8754's solution)
mydata <- Reduce(function(x, y) merge(x, y, by = 'id'), myList)
setNames(mydata, c('id', paste0('mean', seq_along(myList))))

这使:

   id     mean1     mean2      mean3      mean4      mean5
1   1 0.1119114 0.4193226 0.86619590 0.52543072 0.52879193
2   2 0.4630863 0.8786721 0.02012432 0.77274088 0.09227344
3   3 0.9832522 0.4687838 0.49074271 0.01611625 0.69919423
4   4 0.7017467 0.7845002 0.44692958 0.64485570 0.40808345
5   5 0.6204856 0.1687563 0.54407165 0.54236973 0.09947167
6   6 0.1480965 0.7654041 0.43591864 0.22468554 0.84557988
7   7 0.0179509 0.3610114 0.45420122 0.20612154 0.76899342
8   8 0.9862083 0.5579173 0.13540519 0.97311401 0.13947602
9   9 0.3140737 0.2213044 0.05187671 0.07870425 0.23880332
10 10 0.4515313 0.2367271 0.65728768 0.22149073 0.90578043

关于r - 遍历列表时获取列表的元素编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46404066/

相关文章:

r - 如何在 ggplot2 boxplot 中为每组添加多个观察值并使用组均值?

python - 获取用户名而不仅仅是查看列表中的 ID

python - 将对象列表与自定义键进行比较

python - 从数组中的每个单独元素中删除一些东西

r - 如何过滤具有多个条件的行?

r - 如何添加到 group_by_at dplyr 函数中的分组

r - 使用从标签派生的缩写以编程方式重命名数据框列

python - R - 通过删除 x、y 和 z 维度的全零二维矩阵来调整 3D 数组的大小

R:行和列标签上数据帧子集的平均值

r - 更改ggplot中图例框的颜色