ลบคอลัมน์ในกรอบข้อมูลภายในรายการ

ฉันสร้างรายการจาก dataframe ของฉันตามระดับปัจจัยในคอลัมน์ 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

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