我有一个列表与多个数据帧,即:'mylist'和一个数据框架,即"mydf"。有了这两个,我需要用R
解决两个问题实际列表包含许多数据框,实际数据框包含10000行。这里只显示了示例数据
第一个问题:我有一个包含多个数据帧的列表。以下列表是一个示例
mylist1 <- list(a = data.frame(ID = c("a_1", "b_1", "c_1", "d_1", "e_1", "f_1"), colb = c(3.67, 4.94, 8.11, 2.85, 9.53, 7.5), colc = c(3.45, 6.19, 4.96, 6.73, 9.26, 8.62)),
b = data.frame(cola = c("a_1", "b_1", "c_1", "d_1", "e_1", "f_1"), colb = c(5.24, 3.62, 0.29, 6.65, 7.86, 8.7), colc = c(7.03, 7.51, 0.842, 3.56, 8.68, 5.844)))
我想在列表的每个数据帧中使用一个条件来子集行比如这里基于列'colc'中的值,如果列'colc'中的值是>= 6,我想在列表的每个数据帧中子集行
mylist1的预期输出1如下所示…
mylistoutput <- list(a = data.frame(ID = c("b_1", "d_1", "e_1", "f_1"), colb = c(4.94, 2.85, 9.53, 7.5), colc = c(6.19, 6.73, 9.26, 8.62)),
b = data.frame(cola = c("a_1", "b_1", "e_1"), colb = c(5.24, 3.62, 7.86), colc = c(7.03, 7.51, 8.68)))
我尝试使用filter/子集条件将行设置为子集,如下所示
mylistoutput <- lapply(mylist, function(x) filter(x$colc >= 6))
但失败了……
第二个问题:从'mylistoutput'中,我想做两件事
首先,使用'mylistoutput'的第一个数据框,我想将'mylistoutput'中' id'列中的id与'mydf'数据框中的id相匹配
数据框架'mydf'示例如下
mydf <- data.frame(ID = c("a_1","a_1","a_1","a_1","a_1", "b_1","b_1","b_1","b_1", "c_1","c_1","c_1", "d_1","d_1","d_1", "e_1","e_1","e_1","e_1","e_1", "f_1","f_1","f_1","g_1","g_1","g_1","g_1","g_1"), colb = c(3.67,1,2.3,2.5,5, 1.1,2.2,3.7,4.94, 8.11,1.23,2, 2.85,1,2, 5,4,9.53,4,5, 8,7,7.5, 1,2,3,4,5), colc = c(3.45,1,2,3,4, 6.19,1,2,3, 4.96,1,2, 6.73,1,2, 9.26,1,2,3,4, 8.62,1,2, 1,2,3,4,5))
现在,我想提取'mylistoutput'和'mydf'中第一个数据帧之间的所有匹配id
'mydf'的预期输出如下
mydfoutput1 <- data.frame(ID = c("b_1","b_1","b_1","b_1", "d_1","d_1","d_1", "e_1","e_1","e_1","e_1","e_1", "f_1","f_1","f_1"), colb = c(1.1,2.2,3.7,4.94, 2.85,1,2, 5,4,9.53,4,5, 8,7,7.5), colc = c(6.19,1,2,3, 6.73,1,2, 9.26,1,2,3,4, 8.62,1,2))
第二,我想在列表'mylistoutput'中选择匹配的id。例如,"b_1"one_answers";e_1"是列表'mylistoutput'的两个数据框架中的公共id。然后,我想子集相同的id,即"b_1"one_answers"e_1"从数据框'mydf'
预期输出如下
mydfoutput2 <- data.frame(ID = c("b_1","b_1","b_1","b_1", "e_1","e_1","e_1","e_1","e_1"), colb = c(1.1,2.2,3.7,4.94, 5,4,9.53,4,5), colc = c(6.19,1,2,3, 9.26,1,2,3,4, ))
查找解决上述问题的代码
我们可以用lapply
和subset
out <- lapply(mylist1, subset, subset = colc >=6)
对于第二种情况,我们可以执行
subset(mydf, ID %in% out[[1]]$ID)
对于第三种情况,使用Reduce
和intersect
subset(mydf, ID %in% Reduce(intersect, lapply(out, `[[`, 1)))
filter
来自dplyr
,它需要一个data.frame作为输入而不是一个向量
lapply(mylist, function(x) filter(x, colc >= 6))