我根据A列中的因子级别从我的数据框中创建了一个列表。在列表中我想删除该列。我的头说是lapply,但不是别的什么: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
答案 0 :(得分:30)
假设您的列表名为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"))])
答案 1 :(得分:4)
如果您是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)))
答案 2 :(得分:0)
如果您的数据框不包含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)
答案 3 :(得分:0)
我们可以在此处有效地使用括号功能"["
。
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