我遇到了在条件下为单元格值指定colnames的问题。 我想将colname分配给单元格值,当它等于4.我的数据:
DT <- data.table(mtcars[1:5, -c(1:8)])
我想要的结果:
DT2 = data.table(am = rep(NA, 5), gear = c("gear", "gear", "gear", NA, NA), carb = c("carb", "carb", NA, NA, NA))
我尝试过:
DT[, gear:= ifelse((gear==4), colnames(DT), NA )]
但它取了所有的名字。我需要使用特定的colname并为数百列执行此操作。
答案 0 :(得分:2)
循环遍历列,初始set
列为character
numeric
,然后查找每列中值为4的索引并设置{{ 1}}具有相应的列名
value
如果数据集是for(j in seq_along(DT)) {
set(DT, i = NULL, j =j, value = as.character(DT[[j]]))
set(DT, i = which(DT[[j]] ==4), j = j, value = names(DT)[j])
}
DT
# am gear carb
#1: 1 gear carb
#2: 1 gear carb
#3: 1 gear 1
#4: 0 3 1
#5: 0 3 2
,那么我们也可以这样做(尽管它有效,但不适用于data.frame
)
data.table
答案 1 :(得分:2)
你可以试试这个: 按原样使用mtcars。不要将其转换为data.table。您可以稍后转换它。
DT <- mtcars[1:5, -c(1:8)]
DT
for (i in 1:length(colnames(DT))) {
DT[,i] <- ifelse(DT[,i] == 4, colnames(DT)[i], NA)
}
DT2 <- data.table(DT)
DT2
这将为您提供相同的结果。
答案 2 :(得分:0)
library(tidyverse)
> A=DT%>%`is.na<-`(DT==4)%>%rbind(names(DT),.)%>%
fill(names(DT))%>%transmute_all(funs(`is.na<-`(.,grepl("\\d",.))))
> A[-1,]
am gear carb
2 <NA> gear carb
3 <NA> gear carb
4 <NA> gear <NA>
5 <NA> <NA> <NA>
6 <NA> <NA> <NA>