r - 使用 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
})
解决方案
它可以以更紧凑的方式完成
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)))
推荐阅读
- ios - IOS Swift 4 隐藏键盘,同时点击周围干扰按钮按下
- r - 如何遍历列表并在 R 中创建单独的数据框
- coq - 证明函数应用在两个等价函数上的相等性
- php - PHP 将数字截断为最多 15 位,以实现与 MS Excel 中相似的精度
- c++ - 是否会为非类型模板参数的不同值实例化新类
- spring - Spring Boot JTA with Artemis Issue
- elasticsearch - 如何列出 Elasticsearch 集群上所有存储的脚本?
- firebase - How can i limit login on 3 devices max on Firebase at the same time
- c++ - 如果元素类型是原始类型,std::vector::resize() 是否向下花费 O(1) 时间?
- ruby-on-rails - 如何通过电子邮件分组并同时从表中获取所有列?