Как проверить каждое значение кадра данных и заполнить указанные столбцы в R? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть такой фрейм данных:

df <- data.frame(Class = c('A', 'B', 'C'),
                 V1 = c('21, 23', NA, '50, 100'),
                 V2 = c(NA, NA, '13'),
                 V3 = c(NA, '152', '18, 182'))
df[, c(2:4)] <- as.character(df[, c(2:4)])
str(df)

Я установил переменные V1, V2 и V3 как символ:

df[, c(2:4)] <- as.character(df[, c(2:4)])

Я хотел бы протестировать каждую переменную, чтобы подсчитать количество вхождений значений ниже 80, между 80 и 110 и выше 110. После сохранения этих значений нет новых переменных. Он должен вернуть что-то вроде этого:

df <- data.frame(Class = c('A', 'B', 'C'),
                 V1 = c('21, 23', NA, '50, 100'),
                 V2 = c(NA, NA, '13'),
                 V3 = c(NA, '152', '18, 182'), 
                 BELOW = c(2, 0, 3),
                 BETWEEN = c(0, 0, 1),
                 ABOVE = c(0, 1, 1))

Как я мог это сделать?

1 Ответ

0 голосов
/ 29 марта 2019

Этот код делает то, что вы хотите, при условии, что ваши номера всегда разделяются запятой:

df[, c(2:4)] <- lapply(df[,2:4], as.character)
newDF <- cbind(df[,2:4],t(apply(df[,2:4],1,function(row)
  {
  row.vec <- na.omit(unlist(row))
  l.Num <- unlist(lapply(strsplit(row.vec,",\\s?"),as.numeric))
  below <- length(which(l.Num < 80))
  between <- length(which(l.Num >= 80 & l.Num < 110))
  above <- length(which(l.Num > 110))
  return(c(BELOW=below,BETWEEN=between,ABOVE=above))
})))
...