あなたはあなたのコードでいくつかの問題を抱えて:データフレームのための
subset
方法は、(明示的, drop = TRUE
を指定しますしない限り)あなたは常には見返りにデータフレームを取得することを意味しますデフォルトとして, drop = FALSE
セットを持っています。したがって、list
ベクタが結果として得られます。これは、複数のデータフレームをまとめて保持できるR内の唯一の構造体であるためです(また、?subset
ドキュメントの「警告」セクションと、については )。
x == max(...
各列に最大値に等しい値が複数ある可能性があるため、不明な行数を返すことができます。したがって、確かに結果として異なる長さベクトルが得られますが、list
だけが異なるサイズベクトルを保持できます。列ごとに1つの結果だけが必要な場合は、たとえばwhich.max
を使用すると、NA
が自動的に無視されます。
- 最後に、リストではなく実際に何が期待されていたのかはあまり明確ではありませんか?最大値に等しい列に複数の行がある場合は、両方の名前が必要ですか?または最初の?どちらの方は、下記
がMAXSので、我々はあなたがをしたい場合の結果は、基本的に
marks <- read.table(text = "name amarks bmarks cmarks
1 A NA 30 40
2 B 45 78 50
3 C 75 NA 70
4 D 75 16 70", header = TRUE, stringsAsFactors = FALSE)
marks
# name amarks bmarks cmarks
# 1 A NA 30 40
# 2 B 45 78 50
# 3 C 75 NA 70
# 4 D 75 16 70
を異なる方法を見ることができたのは、いくつかのNA
sおよび列に等しいいくつかの重複行を追加してみましょう、いくつかのオプションがあります。すべてname
の私たちは自分のコードに
unlist(sapply(marks[, 2:4], function(x) {subset(marks, x == max(x, na.rm = TRUE), name)}))
# amarks.name1 amarks.name2 bmarks.name cmarks.name1 cmarks.name2
# "C" "D" "B" "C" "D"
代替方法のない同じことを達成することをunlist
を追加することができます外部パッケージを使用するための交換、マトリックス変換及び一般超上でsubset
marks$name[unlist(sapply(marks[, 2:4], function(x) which(x == max(x, na.rm = TRUE))))]
## [1] "C" "D" "B" "C" "D"
あるいは(ベクトル化/過合併症トレードオフ)
marks$name[which(sapply(marks[, 2:4],
function(x) x == max(x, na.rm = TRUE)), arr.ind = TRUE)[, "row"]]
## [1] "C" "D" "B" "C" "D"
または完全にベクトル化溶液を(使用-complication)
marks$name[which(marks[, 2:4] == matrixStats::colMaxs(as.matrix(marks[, 2:4]),
na.rm = TRUE)[col(marks[, 2:4])],
arr.ind = TRUE)[, "row"]]
## [1] "C" "D" "B" "C" "D"
けれども、あなただけしたい場合は最初のマキシ私たちは単純化することができます(NA
も扱います)
marks$name[sapply(marks[, 2:4], which.max)]
# [1] "C" "B" "C"
最初に 'list' *はベクトルです。第二に、 'x == max'のようなことをすると、結果がいくつあるか分かりません。それは1または1千にすることができます。 Rでは、リスト内にのみ異なるサイズのベクトルを格納できるため、Rはリストを返しました。列ごとに1つの結果が常に必要な場合は、代わりに '?which.max'を参照してください。また、あなたの望む結果は何ですか? 'サプリ(マーク[、2:4]、マックス、na.rm = TRUE)'だけで十分でしょうか? –
あるいは、 '$ name [sapply(marks [、2:4]、which.max)]'をマークします。また、 'subset'はデータフレームを返します。理論的には、コードの最後に '、drop = TRUE'を追加することができます。そして、1つのカラムにつき常に1つの' max'があれば、結果として文字ベクトルが得られます。 –
Davidさん、ありがとうございました。 – user1305398