Hapus kolom dalam bingkai data dalam daftar

Saya membuat daftar dari kerangka data saya, berdasarkan level faktor di kolom A. Dalam daftar saya ingin menghapus kolom itu. Kepalaku berkata lapply, tapi tidak yang lain :P

$A
ID Test
A   1
A   1

$B
 ID Test
 B   1
 B   3
 B   5

Ke dalam ini

$A
Test
 1
 1

$B
Test
 1
 3
 5

person ego_    schedule 30.09.2012    source sumber


Jawaban (4)


Dengan asumsi daftar Anda bernama myList, sesuatu seperti ini akan berfungsi:

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

Memperbarui

Untuk solusi yang lebih umum, Anda juga dapat menggunakan sesuatu seperti ini:

# 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
terima kasih :) Saya rasa saya mulai melihat cara menerapkan fungsi dalam lapply.. :) - person ego_; 01.10.2012
comment
@EndreGrünerOfstad, tidak masalah. Lihat jawaban saya yang diperbarui untuk opsi lain yang dapat Anda gunakan. - person A5C1D2H2I1M1N2O1R2T1; 01.10.2012
comment
@mrwab Terima kasih! Btw, tahukah Anda cara menggabungkan dua daftar dengan struktur elemen yang sama? Misalnya. kita beralih dari dua daftar yang setiap level elemennya berisi satu vektor, ke satu daftar yang setiap level elemennya berisi dua vektor. Mungkin itu seharusnya menjadi pertanyaan tersendiri.. - person ego_; 01.10.2012
comment
Kolom terakhir di setiap bingkai data tidak memiliki nama kolom. Bagaimana saya bisa menggunakan lapply untuk menghapus kolom terakhir tanpa menggunakan col. nama? - person Derelict; 13.01.2016
comment
@SoilSciGuy, gunakan sesuatu seperti x[length(x)] <- NULL saja? - person A5C1D2H2I1M1N2O1R2T1; 14.01.2016
comment
@AHandcartAndMohair terima kasih atas jawaban yang bagus! Apa pentingnya titik koma dalam suatu fungsi? Saya tidak begitu mengerti apa maksudnya. - person vagabond; 18.10.2016
comment
@vagabond, izinkan saya menulis dua pernyataan di baris yang sama. Jika Anda tidak memiliki ; x, tidak ada yang bisa dikembalikan.... - person A5C1D2H2I1M1N2O1R2T1; 18.10.2016

Jika Anda adalah pengguna tidyverse, ada solusi alternatif yang menggunakan fungsi map dari paket 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

Kita dapat menggunakan fungsi braket "[" secara efisien di sini.

Contoh

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

Hapus kolom berdasarkan angka

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

Hapus kolom menurut nama

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

Hasil

# [[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

Jika Anda memiliki bingkai data yang tidak berisi kolom ID, Anda dapat menggunakan map_if untuk menghapusnya hanya jika kolom tersebut ada.

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