當該列的兩行都具有非零值時,如何從資料框中洗掉列。
例如,我想從以下更改下表
| 小狗 | 貓 | 蛇 | 大象 |
|---|---|---|---|
| 1 | 0 | 1 | 3 |
| 2 | 1 | 0 | 2 |
到以下
| 貓 | 蛇 |
|---|---|
| 0 | 1 |
| 1 | 0 |
洗掉其他列的原因是因為兩行都有非零數字。如果兩行之一有零,那么我們將保留整列。哪個包含零并不重要。
我嘗試使用 dyplr 和 if else 陳述句,但其中大部分都基于滿足列中的單個條件。
uj5u.com熱心網友回復:
您可以colSums在這里使用:
df[, colSums(df!=0) != nrow(df)]
Cats Snakes
1 0 1
2 1 0
這里的邏輯是保留任何列,使得不等于零的行值計數不等于總行數。換句話說,這表示保留至少有一個零行的任何列。
資料:
df <- data.frame(Dogs=c(1,2), Cats=c(0,1), Snakes=c(1,0), Elephants=c(3,2))
uj5u.com熱心網友回復:
這里有一些其他選擇 -
#1. Base R Filter
Filter(function(x) any(x == 0), df)
#2. purrr::keep
purrr::keep(df, ~any(.x == 0))
#3. purrr::discard
purrr::discard(df, ~all(.x != 0))
所有這些都將輸出回傳為 -
# Cats Snakes
#1 0 1
#2 1 0
uj5u.com熱心網友回復:
這是一個dplyr使用selectwith的解決方案any:
我們只選擇包含至少一個 0 或更少的列:
library(dplyr)
df %>%
select(where(~ any(. <= 0)))
Cats Snakes
1 0 1
2 1 0
對迄今為止提供的答案進行基準測驗:
mbm <- microbenchmark(
base_TimBiegeleisen = df[, colSums(df!=0) != nrow(df)],
dplyr_TarJae = df %>% select(where(~ any(. <= 0))),
base_Ronak_Shah = Filter(function(x) any(x == 0), df),
purr_keep_Ronak_Shah = purrr::keep(df, ~any(.x == 0)),
purr_discard_Ronak_Shah = purrr::discard(df, ~all(.x != 0)),
times=50
)
mbm
autoplot(mbm)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368515.html
上一篇:如何使用多核并行化R中的回圈?
下一篇:將列的類寫入和讀取到csv
