Функция, использующая суммирование строк с помощью grep, выдает ошибку в R - PullRequest
1 голос
/ 23 июня 2019

Я столкнулся с типичной проблемой.Я использовал строку кода в R следующим образом.

myfiles3a <- lapply(myfiles3, function(x) {x$CHINA2 <- rowSums(x[,grep("China", names(x))], na.rm = T); x})

Это дает мне идеальный результат, безупречно примененный с тех пор, как я его написал.Но сегодня, когда я просто хотел то же самое для другой страны Japan или Russia.Код выдает ошибку.как Error in rowSums(x[, grep("Russia", names(x))], na.rm = T) : 'x' must be an array of at least two dimensions

Я совершенно не понимаю, почему это происходит.Моя новая строка кода выглядит следующим образом.

myfiles3c <- lapply(myfiles3, function(x) {x$RUSSIA2 <- rowSums(x[,grep("Russia", names(x))], na.rm = T); x})

Я не могу найти ошибку в двух строках кода.

1 Ответ

1 голос
/ 23 июня 2019

Из-за ошибки проблема заключается в поведении ?Extract, которое по умолчанию использует drop = TRUE. Что происходит, когда мы указываем ,, он преобразуется из data.frame в vector, когда есть один столбец. Рассмотрим следующий пример, где только один столбец с «Россией» в именах

df1 <- data.frame(col1 = 1:5, col2 = 6:10)
df1$RussiaCol <- 1:5
rowSums(df1[,grep("Russia", names(df1))], na.rm = TRUE)

Ошибка в строках строк (df1 [, grep ("Россия", имена (df1))], na.rm = TRUE): 'x' должен быть массивом как минимум двух измерений


Теперь давайте проверим проблему

df1[,grep("Russia", names(df1))]
#[1] 1 2 3 4 5

возвращает vector из-за поведения по умолчанию

df1[,grep("Russia", names(df1)), drop = FALSE]
#   RussiaBot
#1         1
#2         2
#3         3
#4         4
#5         5

Или без использования ,, по умолчанию он принимает индекс в качестве индекса столбца

df1[grep("Russia", names(df1))]

Согласно ?rowSums

x - массив из двух или более измерений, содержащий числовые, комплексные, целые или логические значения или числовой фрейм данных. Для .colSums () и т. Д. Числовая, целочисленная или логическая матрица (или вектор длиной m * n).

Итак, вектор не займет


В list, если мы удалим ,, он должен нормально работать

lapply(myfiles3, function(x) {
       x$RUSSIA2 <- rowSums(x[grep("Russia", names(x))], na.rm = T)
       x})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...