Реорганизовать элементы фрейма данных в зависимости от содержимого строк в R - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть этот набор данных:

df <- structure(list(V1 = c("B1D01", "B1D01", "B1D01", "B1D01", "B1D01", 
"B1D01", "U0155"), V2 = c("U0155", "U0155", "U0155", "U0155", 
"U0155", "U0155", "U3003"), V3 = c("U3003", "U3003", "C1B00", 
"U3003", "U3003", "U3003", "C1B00"), V4 = c("C1B00", "C1B00", 
"U0073", "C1B00", "C1B00", "C1B00", "P037D"), V5 = c("P037D", 
"P037D", NA, "P037D", "P037D", "P037D", "P0616"), V6 = c("P0616", 
"P0616", NA, "P0616", "P0616", "P0616", "P0562"), V7 = c("P0562", 
"P0562", NA, "P0562", "P0562", "P0562", "U0073"), V8 = c("U0073", 
"U0073", NA, "U0073", "U0073", "U0073", NA)), .Names = c("V1", 
"V2", "V3", "V4", "V5", "V6", "V7", "V8"), row.names = 1719:1725, class = "data.frame")

Когда я print(df):

        V1    V2    V3    V4    V5    V6    V7    V8
1719 B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
1720 B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
1721 B1D01 U0155 C1B00 U0073  <NA>  <NA>  <NA>  <NA>
1722 B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
1723 B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
1724 B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
1725 U0155 U3003 C1B00 P037D P0616 P0562 U0073  <NA>

Как вы можете заметить, в этих кодах есть смесь. Например, U3003 в основном находится в V3, но также может быть показано в V2 (последняя строка).

Я хотел бы реорганизовать этот фрейм данных с такими условиями:

  • Каждый код может быть помещен в один столбец.
  • Имена столбцов должны быть именами кодов.
  • Если кодов больше, чем 8 столбцов, количество столбцов может отражать количество кодов.
  • Значения ячеек могут содержать название кодов.
  • Если код отсутствует в строке, должно появиться NA.

Помните, что мой исходный фрейм данных содержит гораздо больше строк, чем этот небольшой пример, извлеченный из оригинала.

1 Ответ

3 голосов
/ 03 апреля 2020

Лучший способ, который я нашел, - это «массировать» фрейм данных, поворачивая его к более длинной форме, а затем вернуть его в исходную форму:

library(tidyverse)

df %>% 
  rownames_to_column() %>% 
  pivot_longer(-rowname, values_drop_na = TRUE) %>% 
  pivot_wider(rowname, names_from = value, values_from = value)

#> # A tibble: 7 x 9
#>   rowname B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
#>   <chr>   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 1719    B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
#> 2 1720    B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
#> 3 1721    B1D01 U0155 <NA>  C1B00 <NA>  <NA>  <NA>  U0073
#> 4 1722    B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
#> 5 1723    B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
#> 6 1724    B1D01 U0155 U3003 C1B00 P037D P0616 P0562 U0073
#> 7 1725    <NA>  U0155 U3003 C1B00 P037D P0616 P0562 U0073

Создано в 2020-04- 03 представьте пакет (v0.3.0)

...