Rの値がゼロの行を削除する方法を解決するのに問題があります。他の手では、na.omit()
を使用してすべてのNA値を削除するか、complete.cases()
を使用してNA値が含まれます。
Rの値がゼロの行を削除する方法を知っている人はいますか?
例えば :
Before
| DateTime | Mac1 | Mac2 | Mac3 | Mac4 |
----------------------------------------------------
| 2011-04-02 06:00 | 20 | 0 | 20 | 20 |
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 |
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 |
| 2011-04-02 06:15 | 23 | 23 | 0 | 23 |
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 |
| 2011-04-02 06:25 | 0 | 25 | 25 | 0 |
After
| DateTime | Mac1 | Mac2 | Mac3 | Mac4 |
----------------------------------------------------
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 |
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 |
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 |
これを行うにはいくつかの異なる方法があります。 apply
を使用することを好みます。これは簡単に拡張できるからです。
##Generate some data
dd = data.frame(a = 1:4, b= 1:0, c=0:3)
##Go through each row and determine if a value is zero
row_sub = apply(dd, 1, function(row) all(row !=0 ))
##Subset as usual
dd[row_sub,]
0
をNA
に交換してから、それらのソリューションのいずれかを使用できますが、違いのために、数値がそれより大きい場合、有限の対数しかありません。 0
。したがって、rowSums
のlog
は、行にゼロがない場合にのみ有限になります。
dfr[is.finite(rowSums(log(dfr[-1]))),]
おそらく、0をNAに置き換えてから、あなたが言及した組み込み関数を使用するというJoranの提案に行くでしょう。それができない/したくない場合、1つのアプローチはany()
を使用して0を含む行を見つけ、それらをサブセット化することです。
set.seed(42)
#Fake data
x <- data.frame(a = sample(0:2, 5, TRUE), b = sample(0:2, 5, TRUE))
> x
a b
1 2 1
2 2 2
3 0 0
4 2 1
5 1 2
#Subset out any rows with a 0 in them
#Note the negation with ! around the apply function
x[!(apply(x, 1, function(y) any(y == 0))),]
a b
1 2 1
2 2 2
4 2 1
5 1 2
Joranのメソッドを実装するには、次のようなものから始める必要があります。
x[x==0] <- NA
Dplyrパッケージのフィルターを使用できます。
データフレームをdfと呼びましょう
library(dplyr) df1 <- filter(df, Mac1 > 0, Mac2 > 0, Mac3 > 0, Mac4 > 0)
df1には、ゼロより大きいエントリを持つ行のみが含まれます。お役に立てれば。
私は次のことをします。
ゼロをNAに設定します。
data[data==0] <- NA
data
NAに関連付けられている行を削除します。
data2<-data[complete.cases(data),]
関数定義の必要性を前提として、csgillespieのメソッドを単純に適応させることを好みます。
d[apply(d!=0, 1, all),]
ここで、d
はデータフレームです。