我还不太熟悉列表中存储的数据帧。
我有一个整数列表,这些整数基本上表示两个数据帧(df_nameA,df_nameB)的行的索引:
str(list1)
List of 2
$ df_nameA :int [1:3] 3 4 6
$ df_nameB :int [1:3] 1 2 4
df_nameA
nrow col1. col 3
1. a. A1
2. b. A2
3 c B1
4. d B2
5. e C1
6. f C2
df_nameB
nrow col1. col 3
1. g D1
2. h D2
3 i E1
4. l E2
5. m F1
6. n F2
list2<-list(df_nameA, df_nameB)
str(list2)
List of 2 : 6 observation and 3 variables
$:'dataframe'....
所需的输出:
df_nameA
nrow col1. col 3
3 c B1
4. d B2
6. f C2
df_nameB
nrow col1. col 3
1. g D1
2. h D2
4. l E2
基本上,我想基于列表1中存储的值对list2中的数据帧进行子集化。
我写了这样的东西,但似乎不起作用:
for(i in seq_along(list1)){
for(i in seq_along(list2)){
lapply(list2, function(x) {return(x[x$nrow %in% list1[[i]],])})
}}
该代码似乎在两个数据帧的第1,2,4行中设置子集 关于我的代码有什么建议吗?
答案 0 :(得分:2)
您可以按以下方式使用lapply
或如下的for
循环
施加
names(list2) <- c("df_nameA", "df_nameB")
lapply(names(list2), function(x) list2[[x]][list2[[x]]$nrow %in% list1[[x]], ])
# [[1]]
# nrow col1. col.3
# 3 3 c B1
# 4 4 d B2
# 6 6 f C2
#
# [[2]]
# nrow col1. col.3
# 1 1 g D1
# 2 2 h D2
# 4 4 l E2
循环
names(list2) <- c("df_nameA", "df_nameB")
for (x in names(list2)) {
list2[[x]] <- list2[[x]][list2[[x]]$nrow %in% list1[[x]], ]
}
list2
# $`df_nameA`
# nrow col1. col.3
# 3 3 c B1
# 4 4 d B2
# 6 6 f C2
#
# $df_nameB
# nrow col1. col.3
# 1 1 g D1
# 2 2 h D2
# 4 4 l E2
数据
可复制格式的数据:
list1 <- list(df_nameA = c(3, 4, 6),
df_nameB = c(1, 2, 4))
list2 <- list(data.frame(nrow = c(1, 2, 3, 4, 5, 6),
col1. = c("a.", "b.", "c", "d", "e", "f"),
col.3 = c("A1", "A2", "B1", "B2", "C1", "C2")),
data.frame(nrow = c(1, 2, 3, 4, 5, 6),
col1. = c("g", "h", "i", "l", "m", "n"),
col.3 = c("D1", "D2", "E1", "E2", "F1", "F2")))
答案 1 :(得分:1)
您正在第二个循环中覆盖i
:
这可能有效:
for(i in seq_along(list1)){
list2[[i]][ list2[[i]]$nrow %in% list1[[i]],]
}