5

論理的な列のブロックを持つ data.frame があります。

> tmp <- data.frame(a=c(13, 23, 52),
+                   b=c(TRUE,FALSE,TRUE),
+                   c=c(TRUE,TRUE,FALSE),
+                   d=c(TRUE,TRUE,TRUE))
> tmp
   a     b     c    d
1 13  TRUE  TRUE TRUE
2 23 FALSE  TRUE TRUE
3 52  TRUE FALSE TRUE

AND論理列の全範囲にわたる論理である要約列(たとえば、e)を計算したいと思います。つまり、特定の行について、すべての b:d がTRUEである場合、e はTRUE;になります。いずれかの b:d がFALSEである場合、e は になりますFALSE

私の期待される結果は次のとおりです。

> tmp
   a     b     c    d     e
1 13  TRUE  TRUE TRUE  TRUE
2 23 FALSE  TRUE TRUE FALSE
3 52  TRUE FALSE TRUE FALSE

列がたくさんあり、名前が面倒なので、列の範囲をインデックスで示したいと思います。次のコードは機能しますが、ベクトル化されたアプローチを使用してパフォーマンスを向上させたいと考えています。

> tmp$e <- NA
> for(i in 1:nrow(tmp)){
+     tmp[i,"e"] <- all(tmp[i,2:(ncol(tmp)-1)]==TRUE)
+ }
> tmp
   a     b     c    d     e
1 13  TRUE  TRUE TRUE  TRUE
2 23 FALSE  TRUE TRUE FALSE
3 52  TRUE FALSE TRUE FALSE

ループを使用せずforに data.frame の行をステップ実行する方法はありますか?

4

2 に答える 2

7

行をループするために使用できますrowSums...そしてそれを準自動化するためのいくつかの凝ったフットワーク:

# identify the logical columns
boolCols <- sapply(tmp, is.logical)
# sum each row of the logical columns and
# compare to the total number of logical columns
tmp$e <- rowSums(tmp[,boolCols]) == sum(boolCols)
于 2012-07-09T22:26:54.027 に答える
1

ifelse ステートメントで rowSums を使用すると、一度に達成できます。

tmp$e <- ifelse(rowSums(tmp[,2:4] == T) == 3, T, F)
于 2012-07-10T11:48:34.917 に答える