多くの変数(列)と行(観測値)を持つデータフレームがあります。1
データフレームの値を含む行を削除したい。
私はできることを知っています
X Y
1 1 1
2 2 1
3 3 1
4 4 4
5 5 5
これを行う:
test <- data.frame("X"=1:5, "Y"=c(1,1,1,4,5))
test[test$X>1 & test$Y>1, ]
そして取得:
X Y
4 4 4
5 5 5
しかし、私はdata$var1 > 1 & data$var2 > 1 ...
20または50の変数を書き出して、それほど単純なことをしたくありません。
多くの書き込みをしなくても同じ結果を得るにはどうすればよいですか?
編集:Big oof:ここで提案されている3つの方法のいずれも、同じ量の観測値を生成しません。これはバグですか?多分それはNAとの相互作用の何らかの影響ですか?
方法1)
df[!apply(df[, myCols], 1, function(x) any(x == 1)),]
> any(df == 1)
[1] TRUE
方法2)
removeRowsWithOnes <- function(df) {
rowsToRemoveIndices <- rowSums(df == 1) > 0
return(df[!rowsToRemoveIndices,])
}
> any(df == 1)
[1] NA
方法3)(方法2とは異なる量の行を削除します))
require(tidyverse)
df %>%
filter(
across(everything(), ~ . != 1)
)
> any(df == 1)
[1] NA
編集2:naをdfに追加した後:
df <- data.frame("x"=c(1,NA,2,2,3,NA), "y"=c(NA,1,1,4,NA,NA))
x y
1 1 NA
2 NA 1
3 2 1
4 2 4
5 3 NA
6 NA NA
方法3)のみが期待される結果を生成します。
x y
1 2 4
2 3 NA
3 NA NA
編集2:
@Jonasのコメントを参照してください:
2つのメソッドを機能させるには、rowSumsおよびanyの呼び出しにna.rm = TRUEを追加します。このオプションはデフォルトでna.rm = FALSEに設定されています(ドキュメントを参照)
別の可能な答えは使用しています tidyverse
require(tidyverse)
df %>%
filter(
across(everything(), ~ . != 1)
)
これは、データフレームにあるすべての変数にわたって、1とは異なる行を保持します。
注:お持ちの場合はNA
、あなたのデータでは、このアプローチは、同様にそれらのインデックスを削除します。したがって、次の拡張機能をお勧めします。
df %>%
filter(
across(everything(), ~ . != 1 | is.na(.))
)
次に、行を削除せずに1とは異なるすべての値を保持しますNA
。そうしないと、保持するつもりだった行が削除される可能性があります(何をしているかによって異なります)。
実行時間の比較
Jonasの例に従って、すべてのソリューションのベンチマークを実行しようとしました。
# Using rowSums
removeRowsWithOnes <- function(df) {
rowsToRemoveIndices <- rowSums(df == 1) > 0
return(df[!rowsToRemoveIndices,])
}
# Using apply
removeRowsWithOnes2 <- function(df) {
df[!apply(df, 1, function(x) any(x == 1)),]
}
# Using tidyversr
removeRowsWithOnes3 <- function(df) {df %>%
filter(
across(everything(), ~ . != 1 | is.na(.))
)}
ベンチマーク
n <- 1e5
set.seed(5555)
bigSampleData <- do.call("cbind",lapply(LETTERS, function(nam) setNames(data.frame(sample(1:1000,n,replace = TRUE)),nam)))
microbenchmark::microbenchmark(removeRowsWithOnes(bigSampleData),removeRowsWithOnes2(bigSampleData),removeRowsWithOnes3(bigSampleData),times=10)
結果
Unit: milliseconds
expr min lq mean median uq max neval cld
removeRowsWithOnes(bigSampleData) 35.57471 40.54827 77.64570 41.06107 60.34422 217.3363 10 b
removeRowsWithOnes2(bigSampleData) 217.34171 222.35136 227.90565 227.05570 229.02625 240.9274 10 c
removeRowsWithOnes3(bigSampleData) 17.42338 22.24363 23.34607 22.88563 23.72934 32.0293 10 a
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加