Превратить значения строк из нескольких столбцов в имена столбцов в R? - PullRequest
1 голос
/ 05 мая 2020

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

   state1     state1_pp     state2     state2_pp    state3   state3_pp
   <chr>      <chr>         <chr>      <chr>         <chr>   <chr>  
 1 0          0.995614      F          0.004386      NA      0  
 2 0          1             NA         0             NA      0  
 3 0          1             NA         0             NA      0

Я хочу, чтобы значения из каждой строки были именами столбцов, а значения numeri c были значениями строк:

   0             F             NA   
   <chr>         <chr>         <chr>     
 1 0.995614      0.004386      0        
 2 1             0             0        
 3 1             0             0

Как мне сделать это в R?

Или более сложный сценарий:

  state1     state1_pp     state2     state2_pp    state3   state3_pp
 1 0          0.995614      F          0.004386      NA      0  
 2 A          1             B          0             C       0  
 3 D          0.7           B          0.3           NA      0

Это то, что я хочу:

   0          A     D     F          B   C   NA
 1 0.995614   0     0     0.004386   0   0   0 
 2 0          1     0     0          0   0   0 
 3 0          0     0.7   0         0.3  0   0

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Сначала предупреждение, если имена столбцов имеют числовой формат c (например, 1) или являются зарезервированными ключевыми словами R (например, NA), могут привести к всевозможным ошибкам. Но если вы должны это сделать, я предлагаю следующее:

library(dplyr)

# extract title row
headers <- df %>%
  head(1) %>%
  select(state1, state2, state3) %>%
  unlist(use.names = FALSE) %>%
  as.character()
# replace NA with "NA"
headers[is.na(headers)] = "NA"

# drop columns that are not wanted
new_df <- df %>%
  select(-state1, -state2, -state3)
# replace column names
colnames(new_df) <- headers

Чтобы ссылаться на ваши новые столбцы, вам, вероятно, потребуется использовать обратные кавычки: `

Итак, с вашим новым имена столбцов 0, F и NA вы можете звонить df$F, но не можете звонить df$NA или df$1. Вместо этого вам нужно будет набрать df$`1` и df$`NA`.

0 голосов
/ 05 мая 2020

Вот попытка с использованием dplyr и tidyr:

library(dplyr)
library(tidyr)


df %>%
  mutate(row = row_number()) %>%
  mutate_all(as.character) %>%
  pivot_longer(cols = -row) %>%
  mutate(name = sub('\\d+', '', name)) %>%
  group_by(name, row) %>%
  mutate(row1 = row_number()) %>%
  pivot_wider() %>%
  group_by(state, row) %>%
  mutate(row1 = row_number()) %>%
  pivot_wider(names_from = state, values_from = state_pp, 
              values_fill = list(state_pp = 0)) %>%
  ungroup() %>%
  select(-row, -row1)


# A tibble: 3 x 7
#  `0`      F        `NA`  A     B     C     D    
#  <chr>    <chr>    <chr> <chr> <chr> <chr> <chr>
#1 0.995614 0.004386 0     0     0     0     0    
#2 0        0        0     1     0     0     0    
#3 0        0        0     0     0.3   0     0.7  
...