Как я могу сделать dataframe из текста с пробелами в r? - PullRequest
0 голосов
/ 07 сентября 2018

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

a<-"
   number    aaa
    1        list(list(10.4444, 11.3333, 12.3333))
    2        list(list(10.3333, 11.3333, 12.3333, 13.3333, 14.3333, 15.3333))
    3        list(list(20.3333))
    4        list(list())
"

я хочу вывод данных из фрейма ниже (цифры должны округляться до 2)

number        aaa 
    1        10.44,11.33,12.33
    2        10.33,11.33,12.33,13.33,14.33,15.33
    3        20.33
    4        NA

Кто-нибудь может мне помочь? заранее спасибо !

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вариант data.table

library(data.table)
setDT(df)[,.(number,gsub("\\)\\)","",gsub("list\\(","",aaa)))]

   number                                              V2
1:      1                         10.4444,11.3333,12.3333
2:      2 10.3333,11.3333,12.3333,13.3333,14.3333,15.3333
3:      3                                         20.3333
4:      4                                                

Для получения округленных чисел вы можете попробовать

temp1<-strsplit(gsub("\\)\\)","", gsub("list\\(", "", df$aaa)), split = ",") # removing characters list( and )) and split the result
temp2 <- lapply(temp1, function(x) round(as.numeric(x),2)) # converting to numeric and rounding

data.frame(number= df$number,
      new= unlist((lapply(temp2,paste,collapse = ", "))))

  number                                      new
1      1                      10.44, 11.33, 12.33
2      2 10.33, 11.33, 12.33, 13.33, 14.33, 15.33
3      3                                    20.33
4      4                                         
0 голосов
/ 07 сентября 2018

Вы можете сделать:

b = read.table(text=gsub('\\b(\\w+) ','\\1:',a),h=T,sep=":",strip.white = T,stringsAsFactors = F)
b$aaa = lapply(parse(text=b[,2]),function(x)unlist(eval(x)))

b
  number                                                  aaa
1      1                            10.4444, 11.3333, 12.3333
2      2 10.3333, 11.3333, 12.3333, 13.3333, 14.3333, 15.3333
3      3                                              20.3333
4      4                                                 NULL

Обратите внимание, что aaa выше - это список в кадре данных, а значения являются числовыми:

с другой стороны, вы можете сделать:

read.table(text = gsub('(?m)(?<=:).*\\(|\\).*','',gsub('\\b(\\w+) ','\\1:',a),perl=T),sep = ":",na.strings = "",h=T,stringsAsFactors = F,strip.white = T)

  number                                                  aaa
1      1                            10.4444, 11.3333, 12.3333
2      2 10.3333, 11.3333, 12.3333, 13.3333, 14.3333, 15.3333
3      3                                              20.3333
4      4                                                 <NA>
...