簡體   English   中英

選擇數據框中包含特定值的行

[英]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.2c(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM