繁体   English   中英

在R中操纵数据框列表的列

[英]Manipulating columns of a list of dataframes in 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 = "_"))}}

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

# Sample list of data.frame's
lst  <- list(
    data.frame(one = letters[1:10], two = 1:10),
    data.frame(one = letters[11:20], two = 11:20))

# Concatenate row number with entries in second column
lapply(lst, function(x) { x$three <- paste(1:nrow(x), x$two, sep = "_"); x })
#[1]]
#   one two three
#1    a   1   1_1
#2    b   2   2_2
#3    c   3   3_3
#4    d   4   4_4
#5    e   5   5_5
#6    f   6   6_6
#7    g   7   7_7
#8    h   8   8_8
#9    i   9   9_9
#10   j  10 10_10
#
#[[2]]
#   one two three
#1    k  11  1_11
#2    l  12  2_12
#3    m  13  3_13
#4    n  14  4_14
#5    o  15  5_15
#6    p  16  6_16
#7    q  17  7_17
#8    r  18  8_18
#9    s  19  9_19
#10   t  20 10_20    

我们能做到这一点的方法之一是创建使用嵌套数据帧enframetibble包。 完成此操作后,我们可以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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM