如何根据另一列中的范围对 R 中的列表进行条件子集
How to conditional subset a list in R based on range in another column
我已经将 100 多个相等的 .xls 文件(每个 10 页)导入到 R 中的列表中。我现在正试图获取我需要的信息。文件中的数据高度非结构化。
我创建了一些玩具数据来展示我想要的。
# create my_list
list1 <- list(data.frame(cross = c("NA","NA","o","o","o","x","o","NA","NA"),
color = c("NA","NA","grey","black","white","yellow","blue","NA","NA"),
temperature = c("NA","NA","3","5","2","7","4","NA","NA")))
list2 <- list(data.frame(cross = c("NA","NA","o","x","o","o","o","NA","NA"),
color = c("NA","NA","grey","black","white","yellow","blue","NA","NA"),
temperature = c("NA","NA","8","6","1","6","9","NA","NA")))
my_list <- list(list1,list2)
我可以轻松地 select 来自 my_list 的一个值和 purrr:map。下面的代码给了我一个矢量,例如所有导入文件中最后给定的温度:
# subset a single value from the list
my_list %>% map_chr(c(1,3,7))
[1] "4" "9"
向量的长度与我导入的文件数相同。
这里要注意的重要一点是,由于原始 .xls 文件的性质,数据很杂乱,每一列中都有很多东西。这就是为什么我 select 从中提取单个单元格的原因。
我的问题是:如何根据位置 3 到 7 select 在“十字”列中带有“x”的颜色?
和以前一样,我需要一个颜色名称向量,所以输出必须是:
“黄色”、“黑色”(如果我们查看上面的玩具数据)和“NA”(如果根本没有交叉)。
记住,每一栏都有很多奇怪的东西,所以我需要在“交叉”栏中指定要查看的范围。措辞上可以是:
”从颜色列中提取颜色名称,在交叉列中,位置 3 到 7 旁边有“x”。因为“x”总是在颜色名称旁边,我猜范围可以在两列(交叉或颜色)中指定。
希望有一个 purrr 解决方案,但谢天谢地,一切都被接受了。
如果我正确理解你的问题,那么应该这样做:
map(my_list, function(tbl){
out_tbl <- tbl[[1]][3:7,] %>%
dplyr::filter(cross == "x")
if(nrow(out_tbl) == 0) return(NA)
as.character(out_tbl$color)
})
我已经将 100 多个相等的 .xls 文件(每个 10 页)导入到 R 中的列表中。我现在正试图获取我需要的信息。文件中的数据高度非结构化。
我创建了一些玩具数据来展示我想要的。
# create my_list
list1 <- list(data.frame(cross = c("NA","NA","o","o","o","x","o","NA","NA"),
color = c("NA","NA","grey","black","white","yellow","blue","NA","NA"),
temperature = c("NA","NA","3","5","2","7","4","NA","NA")))
list2 <- list(data.frame(cross = c("NA","NA","o","x","o","o","o","NA","NA"),
color = c("NA","NA","grey","black","white","yellow","blue","NA","NA"),
temperature = c("NA","NA","8","6","1","6","9","NA","NA")))
my_list <- list(list1,list2)
我可以轻松地 select 来自 my_list 的一个值和 purrr:map。下面的代码给了我一个矢量,例如所有导入文件中最后给定的温度:
# subset a single value from the list
my_list %>% map_chr(c(1,3,7))
[1] "4" "9"
向量的长度与我导入的文件数相同。
这里要注意的重要一点是,由于原始 .xls 文件的性质,数据很杂乱,每一列中都有很多东西。这就是为什么我 select 从中提取单个单元格的原因。
我的问题是:如何根据位置 3 到 7 select 在“十字”列中带有“x”的颜色?
和以前一样,我需要一个颜色名称向量,所以输出必须是:
“黄色”、“黑色”(如果我们查看上面的玩具数据)和“NA”(如果根本没有交叉)。
记住,每一栏都有很多奇怪的东西,所以我需要在“交叉”栏中指定要查看的范围。措辞上可以是:
”从颜色列中提取颜色名称,在交叉列中,位置 3 到 7 旁边有“x”。因为“x”总是在颜色名称旁边,我猜范围可以在两列(交叉或颜色)中指定。
希望有一个 purrr 解决方案,但谢天谢地,一切都被接受了。
如果我正确理解你的问题,那么应该这样做:
map(my_list, function(tbl){
out_tbl <- tbl[[1]][3:7,] %>%
dplyr::filter(cross == "x")
if(nrow(out_tbl) == 0) return(NA)
as.character(out_tbl$color)
})