Нормализация кадра данных, имеющего несколько условий, R - PullRequest
2 голосов
/ 08 мая 2019

У меня есть фрейм данных (df), который содержит NA и цифры.Я хочу нормализовать его, выполнив следующие условия:

  • , если столбец содержит только NA, оставляет все как есть.
  • , если столбец содержит только число, а остальныезначения в этом столбце равны NA, измените это значение на 1 и NA (все NA в этом столбце) на 0.
  • , если столбец содержит числа, нормализуйтеit.

Я сделал следующую попытку, которая не работает.

normalize<-function(x) {
  x <- as.numeric( as.character( x ))
  if(sum(!is.na(x) == 1)) {
    x[which(!is.na(x))] <- 1
    x[which(is.na(x))] <- 0
    return(x)
  } else if(sum(!is.na(x) == 0)) {
    x <- NA
    return(x)
  } else if(sum(!is.na(x) > 1)) {
    y <- (x-min(x, na.rm=TRUE))/(max(x, na.rm=TRUE)-min(x, na.rm=TRUE))
    return(y)
  } 
}

as.data.frame(lapply(df, normalize))

Пример данных:

df <- data.frame(c(123,534,7567,2345,3456,3476,NA,765), c(NA,NA,NA,NA,NA,NA,NA,NA), c(NA,NA,NA,NA,NA,354,NA,NA))

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Ваши условия не сработали должным образом: например, sum(!is.na(x)==1) - это не то, что вам нужно, потому что вы хотите, чтобы sum превышало !is.na(x), а не сумму !is.na(x) == 1.

.работа:

df <- data.frame(a = c(123,534,7567,2345,3456,3476,NA,765), b = c(NA,NA,NA,NA,NA,NA,NA,NA), c = c(NA,NA,NA,NA,NA,354,NA,NA))

normalize<-function(x){
  if(sum(!is.na(x))==1){
    x[which(!is.na(x))] <- 1
    x[which(is.na(x))] <- 0
    return(x)
  }else if(sum(!is.na(x))==0){
    x <- NA
    return(x)
  }else if(sum(!is.na(x)>1)){
    y <- (x-min(x, na.rm=TRUE))/(max(x, na.rm=TRUE)-min(x, na.rm=TRUE)) 
    return(y)
  } 
}

as.data.frame(lapply(df, normalize))
              a  b c
[1,] 0.00000000 NA 0
[2,] 0.05519956 NA 0
[3,] 1.00000000 NA 0
[4,] 0.29848601 NA 0
[5,] 0.44773573 NA 0
[6,] 0.45042249 NA 1
[7,]         NA NA 0
[8,] 0.08623168 NA 0
0 голосов
/ 08 мая 2019
normalize<-function(x) {
    sapply(x, function(y) {if(all(is.na(y))) {y}
           else if(sum(!is.na(y))!=1) {helper<- (y-min(y, na.rm=TRUE))/(max(y, na.rm=TRUE)-min(y, na.rm=TRUE)) 
                                      helper}
           else if(sum(!is.na(y))==1) {helper<-ifelse(is.na(y),0,1)
                 helper}
    })
}

Результат:

normalize(df)

              a  b c
[1,] 0.00000000 NA 0
[2,] 0.05519956 NA 0
[3,] 1.00000000 NA 0
[4,] 0.29848601 NA 0
[5,] 0.44773573 NA 0
[6,] 0.45042249 NA 1
[7,]         NA NA 0
[8,] 0.08623168 NA 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...