Как заменить 1 во фрейме данных именем столбца - PullRequest
0 голосов
/ 04 октября 2018

Я работаю с большим фреймом данных, и мне нужно заменить все из них на имена столбцов, но я не могу понять, как заставить его работать.Кто-нибудь знает, как сделать эту работу.

Вот мои данные:

Names 35 40 45 50 55 60
a      1  0  1  0  0  0
b      0  0  0  1  0  0
c      0  1  0  1  1  0
d      1  0  0  0  0  1

Вот код, который у меня есть:

df[,-1] <- sapply(df[,-1], function(x) {ind <- which(x!=0); x[ind] = 
df[ind,1]; return(x)})

или

mat <- as.matrix(df[, -1])
pos <- which(mat != 0)
mat[pos] <- rep(df[[1]], times = ncol(mat))[pos]
new_dat <- "colnames<-"(cbind.data.frame(df[1], mat), colnames)

оба они дают мне 1-ю строку вместо заголовков столбцов.

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Предполагая, что у вас есть только 1 или 0 в вашем фрейме данных, вы можете использовать произведение фрейма данных по именам столбцов.Попробуйте:

cbind(df[1], mapply(`*`, df[-1], as.numeric(colnames(df[-1]))))
# or just cbind(df[1], df[-1] * as.numeric(colnames(df[-1])))
# output
  Names 35 40 45 50 55 60
1     a 35  0 45  0  0  0
2     b  0  0  0 50  0  0
3     c  0 40  0 50 55  0
4     d 35  0  0  0  0 60
# data
df <- structure(list(Names = structure(1:4, .Label = c("a", "b", "c", 
"d"), class = "factor"), `35` = c(1L, 0L, 0L, 1L), `40` = c(0L, 
0L, 1L, 0L), `45` = c(1L, 0L, 0L, 0L), `50` = c(0L, 1L, 1L, 0L
), `55` = c(0L, 0L, 1L, 0L), `60` = c(0L, 0L, 0L, 1L)), .Names = c("Names", 
"35", "40", "45", "50", "55", "60"), class = "data.frame", row.names = c(NA, 
-4L))
0 голосов
/ 04 октября 2018

Это решение перебирает и применяет простое ifelse() к каждому столбцу:

df[-1] <- lapply(seq_along(df)[-1], function(x) ifelse(df[[x]] == 1, names(df)[x], df[[x]]))
df  

  Names 35 40 45 50 55 60
1     a 35  0 45  0  0  0
2     b  0  0  0 50  0  0
3     c  0 40  0 50 55  0
4     d 35  0  0  0  0 60
0 голосов
/ 04 октября 2018

Мы создаем индекс с col, а затем заменяем его на основе

m1 <- col(df1[-1]) * df1[-1]
i1 <- m1 != 0
df1[-1][i1] <- rep(colnames(m1), each = nrow(m1))[i1]
df1
#   Names 35 40 45 50 55 60
#1     a 35  0 45  0  0  0
#2     b  0  0  0 50  0  0
#3     c  0 40  0 50 55  0
#4     d 35  0  0  0  0 60

ПРИМЕЧАНИЕ. Это также должно работать, когда имена столбцов не являются числовыми.Лучше не иметь имен столбцов с именами, начинающимися с цифры


. Или, если она числовая, мы можем просто умножить после репликации

df1[-1] <- df1[-1] * as.numeric(names(df1)[-1])[col(df1[-1])]

или использовать forцикл

for(i in 2:ncol(df1)) df1[[i]][df1[[i]]==1] <- as.numeric(names(df1)[i])

данные

df1 <- structure(list(Names = c("a", "b", "c", "d"), `35` = c(1L, 0L, 
0L, 1L), `40` = c(0L, 0L, 1L, 0L), `45` = c(1L, 0L, 0L, 0L), 
`50` = c(0L, 1L, 1L, 0L), `55` = c(0L, 0L, 1L, 0L), `60` = c(0L, 
0L, 0L, 1L)), class = "data.frame", row.names = c(NA, -4L
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...