Сопоставление значений с соответствующими столбцами в R - PullRequest
0 голосов
/ 19 сентября 2018

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

Вот исходный кадр данных:

> df
      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

Желаемый вывод:

 > new_df
      col1      col2     col3      col4      
 1       0        10       20        50        
 2       0         5        0       -50                                 
 3    NULL                                         
 4       0       -15       45        65

Для удобства вот вывод для dput(df).

dput(df)
    structure(list(`1` = c("\"4\":50", "\"2\":5", "NULL", "\"4\":65"
), `2` = c("\"2\":10", "\"4\":-50", "", "\"3\":45"), `3` = c("\"1\":0", 
"", "", "\"2\":-15"), `4` = c("\"3\":20", "", "", "\"1\":0")), class = "data.frame", row.names = c(NA, 
-4L))

1 Ответ

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

Вот фрейм данных, который находится как можно ближе к этим данным.Все строки должны иметь либо значение, либо 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...