有条件地将colname设置为单元格值

时间:2018-03-04 18:40:26

标签: r datatable data-manipulation

我遇到了在条件下为单元格值指定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并为数百列执行此操作。

3 个答案:

答案 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>