从数据帧列表中提取行并将文件名与符合条件的行绑定
extract rows from a list of dataframes and bind filename with qualifying rows
对于列表的输入,当列p.value<0.005时提取行并输出包含文件名作为列1和提取的行的数据帧。
输入:文件列表:日期帧 A、B、C 等
A.
col1, col2, col3, p.value
X X X 0.05
X X X 0.001
B.
col1, col2, col3, p.value
X X X 0.03
X X X 0.01
C.
col1, col2, col3, p.value
X X X 0.1
X X X 0.0005
output.
Name, col1, col2, col3, p.value
A X X X 0.001
C X X X 0.0005
files = list.files(".", pattern="\.assoc$")
data1=lapply(files, read.table, header=FALSE, sep=",")
data2 <- lapply(data1, function(x) {i <- which(x$p.value<0.005)
if (length(i) > 0) x[i, ] else NA })
for (i in 1:length(data2)){
data2[[i]]<-cbind(data2[[i]],files[i])}
data_rbind <- do.call("rbind", data2)
colnames(data_rbind)[c(1:5)]<-c("Name", "Col1", "Col2", "Col3", "p.value")
问题出现在下面这行,列表的长度本不该是NA的
data2 <- lapply(data1, function(x) {i <- which(x$p.value<0.005)
if (length(i) > 0) x[i, ] else NA })
我们根据 'p.value' 列的条件,用 lapply
、subset
遍历命名的 list
行,Filter
出 list
元素有 0 行,然后从 Map
和 rbind
中过滤数据 ('tmp') 的 names
创建 'Name' list
个元素来创建单个数据集
tmp <- Filter(nrow, lapply(data1, subset, subset = p.value < 0.005))
do.call(rbind, unname(Map(cbind, Name = names(tmp), tmp)))
-输出
# Name col1 col2 col3 p.value
#2 A X X X 0.0010
#21 C X X X 0.0005
或使用purrr
中的map
循环遍历list
,filter
p.value小于0.005的行,指定.id
创建一个新列 'Name'。在命名列表时,它会在 'Name' 中选取该名称。 _dfr
会将数据集行绑定到单个 data.frame
library(dplyr)
library(purrr)
map_dfr(data1, ~ .x %>%
filter(p.value < 0.005), .id = 'column1')
-输出
# Name col1 col2 col3 p.value
#1 A X X X 0.0010
#2 C X X X 0.0005
数据
data1 <- list(A = structure(list(col1 = c("X", "X"), col2 = c("X", "X"
), col3 = c("X", "X"), p.value = c(0.05, 0.001)), class = "data.frame", row.names = c(NA,
-2L)), B = structure(list(col1 = c("X", "X"), col2 = c("X", "X"
), col3 = c("X", "X"), p.value = c(0.03, 0.01)), class = "data.frame", row.names = c(NA,
-2L)), C = structure(list(col1 = c("X", "X"), col2 = c("X", "X"
), col3 = c("X", "X"), p.value = c(0.1, 5e-04)), class = "data.frame", row.names = c(NA,
-2L)))
对于列表的输入,当列p.value<0.005时提取行并输出包含文件名作为列1和提取的行的数据帧。
输入:文件列表:日期帧 A、B、C 等
A.
col1, col2, col3, p.value
X X X 0.05
X X X 0.001
B.
col1, col2, col3, p.value
X X X 0.03
X X X 0.01
C.
col1, col2, col3, p.value
X X X 0.1
X X X 0.0005
output.
Name, col1, col2, col3, p.value
A X X X 0.001
C X X X 0.0005
files = list.files(".", pattern="\.assoc$")
data1=lapply(files, read.table, header=FALSE, sep=",")
data2 <- lapply(data1, function(x) {i <- which(x$p.value<0.005)
if (length(i) > 0) x[i, ] else NA })
for (i in 1:length(data2)){
data2[[i]]<-cbind(data2[[i]],files[i])}
data_rbind <- do.call("rbind", data2)
colnames(data_rbind)[c(1:5)]<-c("Name", "Col1", "Col2", "Col3", "p.value")
问题出现在下面这行,列表的长度本不该是NA的
data2 <- lapply(data1, function(x) {i <- which(x$p.value<0.005)
if (length(i) > 0) x[i, ] else NA })
我们根据 'p.value' 列的条件,用 lapply
、subset
遍历命名的 list
行,Filter
出 list
元素有 0 行,然后从 Map
和 rbind
中过滤数据 ('tmp') 的 names
创建 'Name' list
个元素来创建单个数据集
tmp <- Filter(nrow, lapply(data1, subset, subset = p.value < 0.005))
do.call(rbind, unname(Map(cbind, Name = names(tmp), tmp)))
-输出
# Name col1 col2 col3 p.value
#2 A X X X 0.0010
#21 C X X X 0.0005
或使用purrr
中的map
循环遍历list
,filter
p.value小于0.005的行,指定.id
创建一个新列 'Name'。在命名列表时,它会在 'Name' 中选取该名称。 _dfr
会将数据集行绑定到单个 data.frame
library(dplyr)
library(purrr)
map_dfr(data1, ~ .x %>%
filter(p.value < 0.005), .id = 'column1')
-输出
# Name col1 col2 col3 p.value
#1 A X X X 0.0010
#2 C X X X 0.0005
数据
data1 <- list(A = structure(list(col1 = c("X", "X"), col2 = c("X", "X"
), col3 = c("X", "X"), p.value = c(0.05, 0.001)), class = "data.frame", row.names = c(NA,
-2L)), B = structure(list(col1 = c("X", "X"), col2 = c("X", "X"
), col3 = c("X", "X"), p.value = c(0.03, 0.01)), class = "data.frame", row.names = c(NA,
-2L)), C = structure(list(col1 = c("X", "X"), col2 = c("X", "X"
), col3 = c("X", "X"), p.value = c(0.1, 5e-04)), class = "data.frame", row.names = c(NA,
-2L)))