Удалить столбец во фрейме данных в списке

Я составил список из своего фрейма данных на основе уровней факторов в столбце A. В списке я хотел бы удалить этот столбец. Моя голова говорит ладно, но больше ничего :P

$A
ID Test
A   1
A   1

$B
 ID Test
 B   1
 B   3
 B   5

В это

$A
Test
 1
 1

$B
Test
 1
 3
 5

person ego_    schedule 30.09.2012    source источник


Ответы (4)


Предполагая, что ваш список называется myList, должно работать что-то вроде этого:

lapply(myList, function(x) { x["ID"] <- NULL; x })

Обновлять

Для более общего решения вы также можете использовать что-то вроде этого:

# Sample data
myList <- list(A = data.frame(ID = c("A", "A"), 
                              Test = c(1, 1), 
                              Value = 1:2), 
               B = data.frame(ID = c("B", "B", "B"), 
                              Test = c(1, 3, 5), 
                              Value = 1:3))
# Keep just the "ID" and "Value" columns
lapply(myList, function(x) x[(names(x) %in% c("ID", "Value"))])
# Drop the "ID" and "Value" columns
lapply(myList, function(x) x[!(names(x) %in% c("ID", "Value"))])
person A5C1D2H2I1M1N2O1R2T1    schedule 30.09.2012
comment
спасибо :) Кажется, я начинаю понимать, как применять функции в lapply.. :) - person ego_; 01.10.2012
comment
@EndreGrünerOfstad, без проблем. Смотрите мой обновленный ответ для другого варианта, который вы можете использовать. - person A5C1D2H2I1M1N2O1R2T1; 01.10.2012
comment
@mrwab Спасибо! Кстати, вы знаете, как объединить два списка с одинаковой структурой элементов? Например. один переходит от двух списков, где каждый уровень элемента содержит по одному вектору, к одному списку, в котором каждый уровень элемента содержит два вектора. Возможно, это должен быть вопрос сам по себе .. - person ego_; 01.10.2012
comment
Последний столбец в каждом фрейме данных не имеет имени столбца. Как я могу использовать lapply, чтобы удалить этот последний столбец без использования col. имена? - person Derelict; 13.01.2016
comment
@SoilSciGuy, вместо этого используйте что-то вроде x[length(x)] <- NULL? - person A5C1D2H2I1M1N2O1R2T1; 14.01.2016
comment
@AHandcartAndMohair спасибо за отличный ответ! Каково значение точки с запятой в функции? Я не совсем понимаю, что это значит. - person vagabond; 18.10.2016
comment
@vagabond, просто чтобы позволить мне написать два утверждения в одной строке. Если бы у вас не было ; x, на самом деле ничего не было бы возвращено.... - person A5C1D2H2I1M1N2O1R2T1; 18.10.2016

Если вы являетесь пользователем tidyverse, существует альтернативное решение, в котором используется функция map из пакета purrr.

# Create same sample data as above
myList <- list(A = data.frame(ID = c("A", "A"), 
                              Test = c(1, 1), 
                              Value = 1:2), 
               B = data.frame(ID = c("B", "B", "B"), 
                              Test = c(1, 3, 5), 
                              Value = 1:3))
# Remove column by name in each element of the list
map(myList, ~ (.x %>% select(-ID)))
person Giorgi Chighladze    schedule 16.11.2018

Здесь мы можем эффективно использовать скобочную функцию "[".

Пример

L <- replicate(3, iris[1:3, 1:4], simplify=FALSE)  # example list

Удалить столбцы по номерам

lapply(L, "[", -c(2, 3))

Удалить столбцы по именам

lapply(L, "[", -grep(c("Sepal.Width|Petal.Length"), names(L[[1]])))

Результат

# [[1]]
#   Sepal.Length Petal.Width
# 1          5.1         0.2
# 2          4.9         0.2
# 3          4.7         0.2
# 
# [[2]]
#   Sepal.Length Petal.Width
# 1          5.1         0.2
# 2          4.9         0.2
# 3          4.7         0.2
person jay.sf    schedule 13.04.2019

Если у вас есть фрейм данных, который не содержит столбца ID, вы можете использовать map_if, чтобы удалить его только там, где он существует.

myList <- list(A = data.frame(ID = c("A", "A"), 
                          Test = c(1, 1), 
                          Value = 1:2), 
           B = data.frame(ID = c("B", "B", "B"), 
                          Test = c(1, 3, 5), 
                          Value = 1:3),
           C = data.frame(Test = c(1, 3, 5), 
                          Value = 1:3))
map_if(myList, ~ "ID" %in% names(.x), ~ .x %>% select(-ID), .depth = 2)
person Jenna Allen    schedule 05.04.2019