[英]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
我们能做到这一点的方法之一是创建使用嵌套数据帧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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.