R: суммы строк для 1 или более столбцов

Это расстраивает, так как кажется, что это должно быть так просто, но это отнимает часы.

Я хочу получить суммы строк для списка столбцов в фрейме данных, но этот список, заданный пользователем, вполне может иметь длину 1, то есть один номер столбца.

rowSums не позволяет суммировать 1 столбец.

rowsum использует группу, которую я нашел совершенно неразборчивой. Я играл с этим примером целую вечность и до сих пор понятия не имею, для чего он нужен, но его нельзя опустить.

В верхнем ответе здесь используются rowSums или apply; во втором используются .SD и lapply, но используются := и .SD и другие термины, которых нет в справке R и которых я раньше не видел, что просто открывает еще одну червоточину поиска и путаницы.

Итак: есть ли что-нибудь, что я могу использовать для:

x <- matrix(runif(100), ncol = 5)
goodcols <- c(1,3,5)
y <- rowSums(x[,goodcols])

это будет работать с 1 или> 1 хорошими столбцами?

Заранее спасибо. В настоящее время я рассматриваю использование:

ifelse(length(goodcols)>1,
y<-rowSums(x[,goodcols]),
y<-x[,goodcols])

person dez93_2000    schedule 01.09.2015    source источник
comment
просто используйте drop=FALSE, чтобы избежать преобразования x в вектор, когда есть только один столбец. .SD и := — это синтаксис пакета data.table. И последнее, поставьте y <- rowSums(x[,goodcols]) вместо y <- rowSums[,goodcols], это должно работать лучше ;-) (так что вам нужно y <- rowSums(x[, goodcols, drop=F]))   -  person Cath    schedule 01.09.2015


Ответы (1)


Когда у вас остался только один столбец в data.frame, matrix или array, R преобразует его в vector. Чтобы сохранить размеры, вам нужно использовать параметр drop.
Drop определяется (как вы можете прочитать в help("[.data.frame")) следующим образом:

логический. Если TRUE, результат приводится к наименьшему возможному размеру. По умолчанию удаляется, если остается только один столбец, но не удаляется, если остается только одна строка.

Итак, в вашем случае вам нужно использовать следующий код, если вы хотите, чтобы rowSums работало независимо от количества столбцов:

y <- rowSums(x[, goodcols, drop = FALSE])
person Cath    schedule 01.09.2015