我有一个像list.1
这样的data.frame,我想从list.1
中选择一行,其中包含c(101,102,103,104)
的值,以创建一个新的data.frame {{1 }}。
list.2
list.1
我想要的结果是:
# ID col1 col2 col3
#1 1 101 102 201
#2 2 201 202 203
#3 3 104 NA 301
#4 4 101 NA NA
#4 5 201 301 302
list.2
然后下一个我要的是:仅包含# ID col1 col2 col3
#1 1 101 102 201
#2 3 104 NA 301
#3 4 101 NA NA
中的c(101,102,103,104)
的值,但全部放在一列中
list.2
list.3
非常感谢!
答案 0 :(得分:0)
您可以通过使用dplyr库中的filter()并使用“ |”来解决第一步作为OR运算符:
library(dplyr)
list.2<-list.1%>%
filter(col1 %in% (101:104)| col2 %in% (101:104) | col3 %in% (101:104))
第二步可以通过dplyr库和过滤器中的select()完成,然后使用rbind(),所有列都具有相同的名称非常重要,因此您必须手动更改它们,即代码。
c1<-list.1%>%
select(c(ID,col1))%>%
filter(col1 %in% (101:104))
c2<-list.1%>%
select(c(ID,col2))%>%
filter(col2 %in% (101:104))
names(c2)<-c("ID","col1")
c3<-list.1%>%
select(c(ID,col3))%>%
filter(col3 %in% (101:104))
names(c3)<-c("ID","col1")
list.3<-rbind(c1,c2,c3)
答案 1 :(得分:0)
我发现解决方案太复杂了。我会选择另一个答案中提到的filter_at方法。无论如何,我将此处的答案保留在pivot_longer上。
如果您有更多的列和值,则可以尝试以下操作:
library(tidyverse)
get_rows <- function(x) any(x %in% c(101, 102, 103, 104))
list_2 <- list_1[apply(list_1[-1], 1, get_rows), ]
产生
# A tibble: 3 x 4
ID col1 col2 col3
<dbl> <dbl> <dbl> <dbl>
1 1 101 102 201
2 3 104 NA 301
3 4 101 NA NA
然后
list_3 <- pivot_longer(list_2, cols = col1:col3, names_to = "cols", values_to = "value")
filter(list_3, value %in% c(101, 102, 103, 104))
会帮你
# A tibble: 4 x 3
ID cols value
<dbl> <chr> <dbl>
1 1 col1 101
2 1 col2 102
3 3 col1 104
4 4 col1 101
或有点凝缩
list_1 %>%
filter(pmap_lgl(select(., starts_with("col")), ~any(c(...) %in% c(101:104)))) %>%
pivot_longer(cols = col1:col3, names_to = "cols", values_to = "value") %>%
filter(value %in% c(101:104))