[英]Return a changed list in R via lapply(), but objects in list not changed
我正在嘗試遍歷數據框列表,刪除與某些條件不匹配的列。 我想更改數據框,使它們基本上缺少 1 列。 執行該函數后,我可以更改數據幀的 LIST,但不能更改原始數據幀本身。
df1 <- data.frame(
a = c("John","Peter","Dylan"),
b = c(1, 2, 3),
c = c("yipee", "ki", "yay"))
df2 <- data.frame(
a = c("Ray","Bob","Derek"),
b = c(4, 5, 6),
c = c("yum", "yummy", "donuts"))
df3 <- data.frame(
a = c("Bill","Sam","Nate"),
b = c(7, 8, 9),
c = c("I", "eat", "cake"))
l <- list(df1, df2, df3)
drop_col <- function(x) {
x <- x[, !names(x) %in% c("e", "b", "f")]
return(x)
}
l <- lapply(l, drop_col)
當我調用列表 l 時,我會得到一個包含我想要的更改的數據框列表。 當我調用列表中的元素 df1 或 df2 或 df3 時,它們沒有刪除的列。
我看過這個解決方案和許多其他解決方案,我顯然錯過了一些東西。
l
list 和df1
, df2
等數據幀是獨立的。 他們彼此沒有任何關系。 獲取新更改的數據框的一種方法是為列表分配名稱並創建新的數據框。
l <- lapply(l, drop_col)
names(l) <- paste0("df", 1:3)
list2env(l, .GlobalEnv)
問題在於,當您創建l
,您正在使用數據幀df1
、 df2
、 df3
副本填充它。 在 R 中,通常不可能傳遞對變量的引用。 一種解決方法是像@Ronak Shah 那樣創建一個環境。
另一種方法是使用get()
和<<-
來更改函數內的變量。
drop_cols <- function(x) {
for(iter in x)
do.call("<<-", list(iter, drop_col(get(iter))))
}
drop_cols(c("df1","df2","df3"))
df1 <- data.frame(
a = c("John","Peter","Dylan"),
b = c(1, 2, 3),
c = c("yipee", "ki", "yay"))
df2 <- data.frame(
a = c("Ray","Bob","Derek"),
b = c(4, 5, 6),
c = c("yum", "yummy", "donuts"))
df3 <- data.frame(
a = c("Bill","Sam","Nate"),
b = c(7, 8, 9),
c = c("I", "eat", "cake"))
# Name the list elements:
l <- list(df1 = df1, df2 = df2, df3 = df3)
drop_col <- function(x) {
x <- x[, !names(x) %in% c("e", "b", "f")]
return(x)
}
l <- lapply(l, drop_col)
# View altered dfs:
View(l["df1"])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.