列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
リストが呼び出されたとすると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"))])
ユーザーの場合、パッケージの機能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)))
ここでブラケット関数を効率的に使用でき"["
ます。
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
列を含まないデータフレームがある場合は、それが存在する場所でのみ削除するために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)