Разделите одну колонку на пять колонок - PullRequest
1 голос
/ 07 апреля 2019

Мой набор данных показывает 6 переменных в 153 наблюдениях, все они сохранены в одном столбце, который выглядит следующим образом:

Ozone.Solar.R.Wind.Temp.Month.Day
1                   41,190,7.4,67,5,1
2                     36,118,8,72,5,2
3                  12,149,12.6,74,5,3
4                  18,313,11.5,62,5,4
5                   NA,NA,14.3,56,5,5

Сейчас я ищу способ разделить эти переменные на 6 разных столбцов, которые в итоге должны выглядеть следующим образом:

Ozone Solar Wind Temp Month Day
41    190   7.4  67   5     1    
36    118   8    72   5     2  
12    149   12.6 74   5     3  
18    313   11.5 62   5     4  
NA    NA    14.3 56   5     5 

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

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Мы можем сделать это легко за base R, используя read.csv

out <- read.csv(text = df[[1]], header = FALSE, col.names = scan(text = names(df), 
             what = "", sep=".", quiet = TRUE), stringsAsFactors = FALSE)
out
#  Ozone Solar Wind Temp Month Day
#1    41   190  7.4   67     5   1
#2    36   118  8.0   72     5   2
#3    12   149 12.6   74     5   3
#4    18   313 11.5   62     5   4
#5    NA    NA 14.3   56     5   5

данные

df <- structure(list(Ozone.Solar.Wind.Temp.Month.Day = c("41,190,7.4,67,5,1", 
 "36,118,8,72,5,2", "12,149,12.6,74,5,3", "18,313,11.5,62,5,4", 
 "NA,NA,14.3,56,5,5")), class = "data.frame", row.names = c("1", 
  "2", "3", "4", "5"))
1 голос
/ 07 апреля 2019

Мы можем использовать separate следующим образом без жесткого кодирования любого из значений.

tidyr::separate(df, names(df), sep = ",", into = strsplit(names(df), "\\.")[[1]])

#  Ozone Solar Wind Temp Month Day
#1    41   190  7.4   67     5   1
#2    36   118    8   72     5   2
#3    12   149 12.6   74     5   3
#4    18   313 11.5   62     5   4
#5    NA    NA 14.3   56     5   5

Используя только известную нам базу R, можно разделить строки на запятую, используя strsplit и rbind список, и присвоить имена, используя setNames.

setNames(do.call(rbind.data.frame, strsplit(as.character(df[[1]]), ",")), 
                 strsplit(names(df), "\\.")[[1]]) 

Данные

df <- structure(list(Ozone.Solar.Wind.Temp.Month.Day = structure(c(4L, 
3L, 1L, 2L, 5L), .Label = c("12,149,12.6,74,5,3", "18,313,11.5,62,5,4", 
"36,118,8,72,5,2", "41,190,7.4,67,5,1", "NA,NA,14.3,56,5,5"), class = 
"factor")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))
...