Есть ли функция для изменения данных в столбец в R - PullRequest
0 голосов
/ 19 июня 2020

Я хочу знать, есть ли функция или код, который изменяет данные фрейма данных в столбец.

Это мой фрейм данных.

number <- c("no.1","no.2","no.3","no.4","no.5","no.6","no.7","no.8","no.9","no.10")

tp1 <- c("car","car","bicycle","car","walk","walk","bus","subway","subway","subway")

tp2 <- c("bicycle",NA,"bus",NA,"subway",NA,"walk",NA,NA,NA)

tp3 <- c("walk",NA,"subway",NA,NA,"bus",NA,NA,NA,NA)

tp4 <- c("bus","walk",NA,NA,NA,NA,NA,NA,NA,NA)

tp5 <- c("subway",NA,NA,NA,NA,NA,NA,NA,NA,NA)

transport <- data.frame(number,tp1,tp2,tp3,tp4,tp5)

и я хочу создать новый фрейм данных как показано на скриншоте.

Пожалуйста, дайте мне совет :)

Я хочу сделать такой фрейм данных

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

error :Values are not uniquely identified не является проблемой в таблице данных. Но, я думаю, это было решено с помощью tidyr 1.1.0 .

В любом случае, вот решение data.table:


library(data.table)

transport <- as.data.table(transport)

transport_long <- melt(transport, 
     id = "number", 
     measure = patterns("tp"), 
var.name ="tp", 
value.name = "transport_mode", 
na.rm = TRUE)

transport_long <- [, c("transport_mode", "yes") := .(paste0("use", transport_mode), "yes")]

dcast(transport_long[, -2], number~transport_mode, drop = FALSE, value.var = "yes")


number usebicycle usebus usecar usesubway usewalk
 1:   no.1        yes    yes    yes       yes     yes
 2:  no.10       <NA>   <NA>   <NA>       yes    <NA>
 3:   no.2       <NA>   <NA>    yes      <NA>     yes
 4:   no.3        yes    yes   <NA>       yes    <NA>
 5:   no.4       <NA>   <NA>    yes      <NA>    <NA>
 6:   no.5       <NA>   <NA>   <NA>       yes     yes
 7:   no.6       <NA>    yes   <NA>      <NA>     yes
 8:   no.7       <NA>    yes   <NA>      <NA>     yes
 [ reached getOption("max.print") -- omitted 2 rows ]


  
0 голосов
/ 19 июня 2020

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

library(dplyr)
library(tidyr)

transport %>%
  pivot_longer(cols = -number, values_drop_na = TRUE) %>%
  mutate(n = 'yes') %>%
  select(-name) %>%
  pivot_wider(names_from = value, values_from = n, names_prefix = 'use_')


#  number use_car use_bicycle use_walk use_bus use_subway
#   <chr>  <chr>   <chr>       <chr>    <chr>   <chr>     
# 1 no.1   yes     yes         yes      yes     yes       
# 2 no.2   yes     NA          yes      NA      NA        
# 3 no.3   NA      yes         NA       yes     yes       
# 4 no.4   yes     NA          NA       NA      NA        
# 5 no.5   NA      NA          yes      NA      yes       
# 6 no.6   NA      NA          yes      yes     NA        
# 7 no.7   NA      NA          yes      yes     NA        
# 8 no.8   NA      NA          NA       NA      yes       
# 9 no.9   NA      NA          NA       NA      yes       
#10 no.10  NA      NA          NA       NA      yes    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...