Имею следующий массив df
A B C D E F G
[1,] 0 -4 12 33 -4 -1 -4
[2,] 1 -3 13 34 -3 0 -3
[3,] 2 -2 14 35 -2 1 -2
[4,] 3 -1 15 36 -1 2 -1
[5,] 4 0 16 37 0 3 0
[6,] 5 1 17 38 1 4 1
str
df следующий:
int [1:6, 1:7] 0 1 2 3 4 5 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:7] "A" "B" "C" "D" ...
И я хотел бы для каждого столбца извлечь элементы, которые больше 0, но оставить имена столбцов, например, для создания списка. Один из способов сделать это - использовать lapply
lapply(df, function(x) x[which(x > 0)])
Но есть две проблемы:
очень медленно для многих операций (по сути, это цикл)
не всегда создает список, который мне нужен (если все исходные элементы случайно все положительные, он оставит его как есть).
Есть ли решение лучше, чем lapply
?
Вышеупомянутое целое число, но я думаю, может быть преобразовано в матрицу
целое число (вектор) имеет 1 измерение
Пожалуйста, предоставьте dput(df)
. То, что вы показываете, похоже на матрицу.
пожалуйста, опубликуйте результат class(df)
, я уверен, что это матрица.
Ваша инструкция неверна, она должна выдать ошибку. Кажется, вам нужен apply
, а не lapply
.
int [1: 6, 1: 7] 0 1 2 3 4 5 ... - attr (*, "dimnames") = Список из 2 .. $: NULL .. $: chr [1: 7] "A" «Б» «В» «Г» ...
Пожалуйста, укажите в вопросе полный вывод. Но это матрица. В любом случае лучше lapply(as.data.frame(m), function(x) x[x > 0])
не получишь.
@Rui прав, я промахнулся, lapply не нуждается в 2
Когда вы используете lapply для матрицы, он оценивает ЯЧЕЙКИ, а не СТОЛБЦА.
у тебя есть матрица?