Мой набор данных показывает 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
Заранее спасибо за вашу помощь!
Для меня это должно быть решено при чтении файла. Я бы сделал три строки кода. Первым считывает и разделяет заголовки. Второй с пропуском первой строки read.csv
и установкой заголовка FALSE. Третий добавляет имена заголовков к результирующему data.frame.
Мы можем использовать 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"))
Мы можем легко сделать это в 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"))
Пожалуйста, поделитесь своими данными в идеально воспроизводимой форме. Это делает ответы более качественными. Вы можете использовать
dput()
и вставить результаты сюда для этого эффекта.