Вот фрейм данных, который находится как можно ближе к этим данным.Все строки должны иметь либо значение, либо NA, поэтому третья строка имеет:
3 "NULL" "" "" ""
Кавычки и разделители необходимо обрабатывать особым образом, поскольку это расположение данных было нелегко ввести с помощью read.table
:
df <- read.table(text=' col1, col2, col3, col4
1, "4":50 , "2":10 , "1":0, "3":20
2, "2":5, "4":-50
3, NULL
4 , "4":65, "3":45, "2":-15, "1":0', sep=",", header=TRUE,quote="\"",fill=TRUE,strip.white=TRUE)
Теперь можно работать с каждой строкой отдельно и располагать значения в месте расположения клавиш:
Моя первая попытка была с:
df2 <- apply(df, 1, function(x) if(x=="NULL"){ c("NULL",NA,NA,NA) } else
{ z <- rep(0,4)
for (i in x){
z[as.numeric(sub( ":.+$", "", i))] <- sub("^.+:", "", i) }
return(z)})
Что если высмотреть на это сбоку почти правильно.Поскольку R возвращает результаты из apply
в расположении "по столбцу", вам часто нужно транспонировать:
df3 <- t(df2)
df3
[,1] [,2] [,3] [,4]
1 "0" "10" "20" "50"
2 "0" "5" "0" "-50"
3 "NULL" NA NA NA
4 "0" "-15" "45" "65"
@Z.Springirth: Пожалуйста, не жалуйтесь на тот факт, что это символьные значения.Вы тот, кто указал значение «NULL» в этом выводе.«NULL» не является допустимым числовым значением, и столбцы в фреймах данных должны быть одного класса.Таким образом, одно символьное значение в столбце заставляет все значения быть символами.
Это создает впечатление успеха, но я предупреждаю вас, что столбцы - это фактор, а не символ.Записи не будут вести себя как числа, если вы не приведете их (по отдельности) к цифрам:
> as.data.frame(df3)
V1 V2 V3 V4
1 0 10 20 50
2 0 5 0 -50
3 NULL <NA> <NA> <NA>
4 0 -15 45 65
Если вы хотите отказаться от требования «NULL», то это может завершить процесс:
> df4 <- as.data.frame(df3,stringsAsFactors=FALSE)
> df4[] <- lapply(df4, as.numeric)
Warning message:
In lapply(df4, as.numeric) : NAs introduced by coercion
> df4
V1 V2 V3 V4
1 0 10 20 50
2 0 5 0 -50
3 NA NA NA NA
4 0 -15 45 65