选择数据框中包含特定值的行

时间:2019-11-26 12:06:00

标签: r

我有一个像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

非常感谢!

2 个答案:

答案 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))
相关问题