[英]Selects the row in the data frame that contains a specific value
我有一個像 list.1 的list.1
,我想從list.1
中選擇包含c(101,102,103,104)
值的行來創建一個新的 data.frame 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
然后我想要的下一個是:只包含list.2
中c(101,102,103,104)
的值,但全部放在一列中list.3
# ID col1
#1 1 101
#2 1 102
#3 3 104
#4 4 101
非常感謝!
您可以通過使用 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)
我發現解決方案太復雜了。 我會選擇另一個答案中提到的 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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.