处理列表中的数据框,使用条件来子集行,使用r来处理另一个数据框



我有一个列表与多个数据帧,即:'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, ))

查找解决上述问题的代码

我们可以用lapplysubset

out <- lapply(mylist1, subset, subset = colc >=6)
对于第二种情况,我们可以执行
subset(mydf, ID %in% out[[1]]$ID)

对于第三种情况,使用Reduceintersect

subset(mydf, ID %in% Reduce(intersect, lapply(out, `[[`, 1)))

filter来自dplyr,它需要一个data.frame作为输入而不是一个向量

lapply(mylist, function(x) filter(x, colc >= 6))

最新更新