首页 > 解决方案 > 使用 lapply 在 R 中逐列将某个值的所有元素更改为另一个值

问题描述

对于数据框中的每一列,我想用列号替换所有非零值。即,如果我有一个像这样的数据框:

> df1 <- as.data.frame(matrix(c(0,0.1,0,0.1,0,0.1,0,0.1,0,0.1,0,0.1), nrow = 4, ncol = 3))
> df1
   V1  V2  V3
1 0.0 0.0 0.0
2 0.1 0.1 0.1
3 0.0 0.0 0.0
4 0.1 0.1 0.1

我想将其更改为:

>df2
  V1 V2 V3
1  0  0  0  
2  1  2  3
3  0  0  0
4  1  2  3

我已经尝试了以下多种变体但没有成功 - 我只是无法理解 lapply 调用中的函数所指的内容。

  counter <- 0
  lapply(df1, function(x){
    df1[,x][df1[,x]>0] <- counter
    counter <<- counter+1
  })

  counter <- 0
  lapply(df1, function(x){
    x[][x[]>0] <- counter
    counter <<- counter+1
  })

标签: rdataframeindexinglapply

解决方案


它可以以更紧凑的方式完成

df1[] <-  col(df1) * !!df1

-输出

df1
#  V1 V2 V3
#1  0  0  0
#2  1  2  3
#3  0  0  0
#4  1  2  3

!!df1将“ df1 ”转换为逻辑矩阵,col(df1)即TRUE 表示非零值,FALSE 表示零(列索引


或者其他选项dplyr

library(dplyr)
df1 %>% 
   mutate(across(everything(), ~  match(cur_column(), names(df1)) * (. != 0)))

推荐阅读