簡體   English   中英

使用 R 根據列值過濾大型數據框

[英]Filtering a large data frame based on column values using R

我有一個非常大的 dataframe,幾乎有 502493 行和 261 列。 我想過濾它並需要具有特定代碼的 ID(以“E”開頭的代碼)。 這就是我的數據的樣子,

身份證 代碼1 代碼2
1個 C443 E109
2個 AX31 M223
1個 E341 QWE1
3個 E131 M223

我需要的 output 是代碼僅以“E”開頭的 ID。

身份證 代碼
1個 E109
1個 E341
3個 E131

我正在嘗試使用 dplyr package 的“過濾器”,但沒有獲得所需的 output。提前致謝

我們可以使用pivot_longer重塑為“長”格式,並通過從提取的第一個字符(使用substr )創建邏輯向量來進行filter

library(dplyr)
library(tidyr)
df1 %>%
   pivot_longer(cols = starts_with("code"), 
       values_to = 'code', names_to = NULL) %>%   
   filter(substr(code, 1, 1) == "E")

-輸出

# A tibble: 3 × 2
    IDs code 
  <int> <chr>
1     1 E109 
2     1 E341 
3     3 E131 

如果數據真的很大,我們可以在pivot_longer之前做一個filter ,只保留列中至少有一個 'E' 的行

df1 %>%
   filter(if_any(starts_with('code'), ~ substr(., 1, 1) == 'E')) %>% 
   pivot_longer(cols = starts_with("code"), 
       values_to = 'code', names_to = NULL) %>%   
   filter(substr(code, 1, 1) == "E")

如果是非常大的數據,另一種選擇是data.table 將 data.frame 轉換為 'data.table' ( setDT ),使用lapply感興趣的列 ( .SDcols ),將不以“E”開頭的元素replaceNA ,然后使用fcoalesce獲取第一個非-NA 元素為每一行使用do.call

library(data.table)
na.omit(setDT(df1)[, .(IDs, code = do.call(fcoalesce, 
    lapply(.SD, function(x) replace(x, substr(x, 1, 1) != "E", 
      NA)))), .SDcols = patterns("code")])

-輸出

   IDs code
1:   1 E109
2:   1 E341
3:   3 E131

數據

df1 <- structure(list(IDs = c(1L, 2L, 1L, 3L), code1 = c("C443", "AX31", 
"E341", "E131"), code2 = c("E109", "M223", "QWE1", "M223")), 
class = "data.frame", row.names = c(NA, 
-4L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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