Разделите строки в столбце R и получите максимум разделенной строки - PullRequest
3 голосов
/ 06 апреля 2020

У меня есть фрейм данных, в котором есть столбец с числами, содержащимися в строке

например,

test<-data.frame(a=c('"1;2;3;4"','".;.;."',NA,'"5;.;7;8"'))

Я хотел бы создать второй столбец, который является максимальным значением строки разделения или NA, если это недоступно.

Я пытался:

test$b<- ifelse(!is.na(test$a),as.numeric(max(strsplit(test$a, ";"))),NA)

, но выдает ошибку.

, поэтому тест $ b должен быть равен 4, NA, NA , 8

Заранее спасибо за помощь

Ответы [ 4 ]

3 голосов
/ 06 апреля 2020

Здесь есть опция, где мы разделяем столбец 'a' на символы, которые не являются цифрами, затем l oop над list с условием if all значения равны NA, возвращаются NA или иначе получить max из numeric значений

sapply(strsplit(as.character(test$a), '[;"]'), function(x) 
   if(all(is.na(as.numeric(x)))) NA else max(as.numeric(x), na.rm = TRUE))
#[1]  4 NA NA  8
2 голосов
/ 07 апреля 2020

[[:punct:]] отфильтрует ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ {| } ~ .`

Подробнее читайте здесь: ?regex

test$b <- unlist(lapply(strsplit(test$a, "[[:punct:]]"), function(x) {
  x <- as.numeric(x)
  ifelse(all(is.na(x)), NA, max(x, na.rm = TRUE))
} ))
test
#           a  b
# 1 "1;2;3;4"  4
# 2   ".;.;." NA
# 3      <NA> NA
# 4 "5;.;7;8"  8
2 голосов
/ 06 апреля 2020

Другое базовое решение R может использовать regmatches + sapply, например,

test <- within(test,b <- sapply(regmatches(a,gregexpr("\\d+",a)),
                                function(x) ifelse(length(x),max(as.numeric(x)),NA)))

, такое что

> test
          a  b
1 "1;2;3;4"  4
2   ".;.;." NA
3      <NA> NA
4 "5;.;7;8"  8
1 голос
/ 07 апреля 2020

Использование пакета data.table:

# set up:
library(data.table)
setDT(test)

# solution:
test[, b := as.numeric(sapply(strsplit(gsub('"', "", a), ";"), max)), by = 1:4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...