替换数据框列表中的值

时间:2018-08-14 20:51:13

标签: r lapply

我有一个数据帧列表。每个都有一个ID列,然后是许多数字列(带有列名)。

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

在单个数据帧中部分完成此操作
 df[,-1] <- 0

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

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

我曾尝试使用子集ifelse进行变异,但是在这种简单的替换中苦苦挣扎。可以从头开始重新创建数据帧,或者在末尾重新组合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))

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您的问题的措词有点奇怪,因为听起来您想将所有的1替换为0,但是您的示例似乎与此矛盾。

如果要将1替换为0,可以这样操作:

DECLARE @searchFor INT = 10490;

SELECT code = s1.item, s2.item
FROM dbo.DelimitedSplit8K(@code,',')  s1
JOIN dbo.DelimitedSplit8K(@value,'~') s2 ON s2.ItemNumber = s1.ItemNumber-1
WHERE s1.Item = @searchFor;