【问题标题】:Replacing values in a list of data frames替换数据框列表中的值
【发布时间】:2018-08-14 20:51:13
【问题描述】:

我有一个数据框列表。每个都有一个 ID 列,后跟多个数字列(带有列名)。

我想将所有数字列的所有 1 替换为 0,但保持 ID 列相同。我可以使用

部分使用单个数据框来完成此操作
 df[,-1] <- 0

但是当我尝试将它嵌入 lapply 时,它失败了:

df2 <- lapply(df, function(x) {x[,-1] <- 0})

我尝试过使用子集、ifelse、while、mutate,但在这个简单的替换中遇到了困难。可以从头开始重新创建数据框,或者在最后重新组合 ID 列,但这让我觉得应该很容易......

测试清单:

test_list <- list(data.frame("ID"=letters[1:3], "col2"=1:3, "col3"=0:2), data.frame("ID"=letters[4:6], "col2"=4:6, "col3"=0:2))

最终结果应该是:

final_list <- list(data.frame("ID"=letters[1:3], "col2"=0, "col3"=0), data.frame("ID"=letters[4:6], "col2"=0, "col3"=0))

【问题讨论】:

  • 如果您只想“将所有数字列的所有 1 替换为 0”,您可以尝试:lapply(test_list, function(x) replace(x, x == 1, 0))

标签: r lapply


【解决方案1】:

将return(x) 添加到您的函数中,然后它应该可以正常工作了。

lapply(test_list, function(x){
  x[, -1] <- 0
  return(x)
})
# [[1]]
#   ID col2 col3
# 1  a    0    0
# 2  b    0    0
# 3  c    0    0
# 
# [[2]]
#   ID col2 col3
# 1  d    0    0
# 2  e    0    0
# 3  f    0    0

【讨论】:

    【解决方案2】:

    您的问题措辞有点奇怪,听起来您想用 0 替换所有 1,但您的示例似乎与此相矛盾。

    如果你只想用 0 替换 1,你可以这样做:

    lapply(df, function(x) {x[x==1] <- 0; return(x)})
    
    [[1]]
      ID col2 col3
    1  a    0    0
    2  b    2    0
    3  c    3    2
    
    [[2]]
      ID col2 col3
    1  d    4    0
    2  e    5    0
    3  f    6    2
    

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2018-09-29
      • 2022-01-14
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多