操作R中的数据帧列表的列

时间:2018-03-15 10:50:52

标签: r

我有一个数据框列表,我想为每个数据框添加一列,此列将是行号和另一个变量的串联。

我已经设法使用for循环但是在处理大型数据集时需要花费大量时间,是否有办法避免for循环?

my_data_vcf <-lapply(my_vcf_files,read.table, stringsAsFactors = FALSE)
for i in 1:length(my_data_vcf){
        for(j in 1:length(my_data_vcf[[i]]){ 
             my_data_vcf[[i]] <- cbind(my_data_vcf[[i]], "Id" = paste(c(variable,j), collapse = "_"))}}

2 个答案:

答案 0 :(得分:3)

您可以使用User;由于您没有提供最小的样本数据集,我正在生成一些样本数据。

lapply

答案 1 :(得分:0)

我们可以这样做的一种方法是使用enframe包中的tibble创建嵌套数据框。完成后,我们可以unnest数据并使用mutate连接行号和列:

library(tidyverse)

# using Maurits Evers' data, treating stringsAsFactors
lst <- list(
  data.frame(one = letters[1:10], two = 1:10, stringsAsFactors = F),
  data.frame(one = letters[11:20], two = 11:20, stringsAsFactors = F)
)

lst %>% 
  enframe() %>% 
  unnest(value) %>% 
  group_by(name) %>% 
  mutate(three = paste(row_number(), two, sep = "_")) %>% 
  nest()

返回:

# A tibble: 2 x 2
   name data             
  <int> <list>           
1     1 <tibble [10 × 3]>
2     2 <tibble [10 × 3]>

如果我们unnest数据,我们可以看到var three是var two和行号的串联:

lst %>% 
  enframe() %>% 
  unnest(value) %>% 
  group_by(name) %>% 
  mutate(three = paste(row_number(), two, sep = "_")) %>% 
  nest() %>% 
  unnest(data)

返回:

# A tibble: 20 x 4
    name one     two three
   <int> <chr> <int> <chr>
 1     1 a         1 1_1  
 2     1 b         2 2_2  
 3     1 c         3 3_3  
 4     1 d         4 4_4  
 5     1 e         5 5_5  
 6     1 f         6 6_6  
 7     1 g         7 7_7  
 8     1 h         8 8_8  
 9     1 i         9 9_9  
10     1 j        10 10_10
11     2 k        11 1_11 
12     2 l        12 2_12 
13     2 m        13 3_13 
14     2 n        14 4_14 
15     2 o        15 5_15 
16     2 p        16 6_16 
17     2 q        17 7_17 
18     2 r        18 8_18 
19     2 s        19 9_19 
20     2 t        20 10_20