簡體   English   中英

通過 lapply() 返回 R 中已更改的列表,但列表中的對象未更改

[英]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 ,您正在使用數據幀df1df2df3副本填充它。 在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM