その他のコメントと回答はうまくいきますが、data.frame
を扱うときに悪い行為を促すことを推奨しています。まず第一に、apply
とrowSums
はmatrix
がデータとして期待されており、data.frame
が与えられれば喜んでそのようなことになります。 data.frame
列のいずれかがcharacter
の場合、すべての列はcharacter
に変換されます。一部の操作は、実際には== "1"
...となるため、期待どおりに動作します(たとえば、== 1
など)。ただし、丸め誤差の影響で望ましくない効果が生じることがあります。一例として、
、
n <- 20
set.seed(2)
tab <- data.frame(
a = as.character(sample(n, replace = FALSE)),
b1 = sample(5, size = n, replace = TRUE),
b2 = sample(5, size = n, replace = TRUE),
stringsAsFactors = FALSE
)
str(tab)
# 'data.frame': 20 obs. of 3 variables:
# $ a : chr "4" "14" "11" "3" ...
# $ b1: int 4 2 5 1 2 3 1 2 5 1 ...
# $ b2: int 5 2 1 1 5 4 5 2 3 5 ...
apply(tab, 1, function(y) any(y == 1))
# [1] FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE
apply(tab, 1, sum)
# Error in FUN(newX[, i], ...) : invalid 'type' (character) of argument
rowSums(tab == 1)
# [1] 0 0 1 2 0 0 1 0 0 1 2 2 0 0 0 0 0 1 0 1
rowSums(tab)
# Error in rowSums(tab) : 'x' must be numeric
これに対処するためのいくつかの簡単な方法があります。あなたの例を考えると、列2:16
は数値で、あなたが心配しているようです。 (前者はかなり特定され、後者は他の機能に拡張することができます)
rowSums(tab[,2:16] == 1) # Frank's comment
apply(tab[,2:16], 1, function(y) any(y == 1)) # suggested by You-leee's answer
:そのような場合、あなたは安全のいずれかを使用することができます。一度常に
を行うことができる唯一の非numeric
がある場合、第3の技術は、列が選択した実行時に決定することです:
isnum <- sapply(tab, is.numeric)
Reduce(`|`, lapply(tab[isnum], function(y) any(y == 1)))
これは少し複雑だった、復帰理由lapply
はlist
ですが、それでも正常に動作します。 isnum
の使用は、grepl
のようなものを使用して、列名にも基づいている可能性があることを理解してください。このメソッドは、どちらの列も一致しないとエラーにならないという点で、かなり堅牢です。
適用ファミリの機能を参照してください。あなたのR端末に '?apply'または'?lapply'と打ち込んで、Rの世界へようこそ! – JMT2080AD
IsraelMotta、あなたの質問を解決する答えがありますか?そうであれば、エチケットは、特定の答えの左側にあるチェックマークを選択することによって、あなたが好みの答えを「受け入れる」ことを示唆しています。 (そうでない場合は、フィードバックをお願いします。)ありがとう! – r2evans