[英]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”開頭的元素replace
為NA
,然后使用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.