Преобразование столбца в несколько столбцов с использованием строкового значения в R - PullRequest
0 голосов
/ 03 октября 2019

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

x <- data.frame("name" = c("John","John","John","John","John","Sarah","Sarah","Sarah"), "Day" = c(1,1,1,1,1,2,2,2), "Data" = c("Map 28", 2,3,"Transfer","Time","Map 18",2,3))

, которая выглядит следующим образом:

 name Day     Data
1  John   1   Map 28
2  John   1        2
3  John   1        3
4  John   1 Transfer
5  John   1     Time
6 Sarah   2   Map 18
7 Sarah   2        2
8 Sarah   2        3

Мне нужно просмотреть столбец «данные» и найти в любое время слово «карта»использовать, а затем преобразовать все данные в этом столбце. Вот так:

  name Day   Data Val1 Val2     Val3 Val4
1  John   1 Map 28    2    3 Transfer Time
2 Sarah   2 Map 18    2    3     <NA> <NA>

Любая помощь с этим будет принята с благодарностью!

[РЕДАКТИРОВАТЬ]

Извините, я думаю, я упростил мой пример ... проблемав том, что каждый человек в каждый день будет иметь несколько значений «Карта», которые должны быть найдены. Так что это выглядит примерно так:

x <- data.frame("name" = c("John","John","John","John","John","John","John","John","John","John","John","John","Sarah","Sarah","Sarah","Sarah","Sarah","Sarah"), 
                "Day" = c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2), 
                "Data" = c("Map 28", 2,3,"Transfer","Time","Map 15",2,3,"Text","Map3",2,4,"Map 18",2,3,"Map 22",2,3))

    name Day     Data
1   John   1   Map 28
2   John   1        2
3   John   1        3
4   John   1 Transfer
5   John   1     Time
6   John   1   Map 15
7   John   1        2
8   John   1        3
9   John   1     Text
10  John   1     Map3
11  John   1        2
12  John   1        4
13 Sarah   2   Map 18
14 Sarah   2        2
15 Sarah   2        3
16 Sarah   2   Map 22
17 Sarah   2        2
18 Sarah   2        3

и тогда конечный результат будет ...

y <- data.frame("name" = c("John","John","John","Sarah", "Sarah"), 
                "Day" =c(1,1,1,2,2), 
                "Data"= c("Map 28","Map 15","Map 3","Map 18","Map 22"), 
                "Val1" =c(2,2,2,2,2), 
                "Val2"=c(3,3,4,3,3), 
                "Val3"=c("Transfer","Text",NA,NA,NA), 
                "Val4"=c("Time",NA,NA,NA,NA))

name Day   Data Val1 Val2     Val3 Val4
1  John   1 Map 28    2    3 Transfer Time
2  John   1 Map 15    2    3     Text <NA>
3  John   1 Map 3    2    4     <NA> <NA>
4 Sarah   2 Map 18    2    3     <NA> <NA>
5 Sarah   2 Map 22    2    3     <NA> <NA>

1 Ответ

1 голос
/ 03 октября 2019

вы можете использовать reshape из базы R после добавления переменной time, используя ave

reshape(transform(x,time=ave(Day,Day,FUN=seq_along)),v.names="Data",dir="wide",idvar = "name")

   name Day Data.1 Data.2 Data.3   Data.4 Data.5
1  John   1 Map 28      2      3 Transfer   Time
6 Sarah   2 Map 18      2      3     <NA>   <NA>

с вашим новым редактированием: Используя базу R, вы можете сделать:

d = transform(x,ID=cumsum(grepl('Map',Data))->a,time=ave(a,a,FUN=seq_along))

reshape(d,v.names="Data",idvar = "ID",dir="wide")
    name Day ID Data.1 Data.2 Data.3   Data.4 Data.5
1   John   1  1 Map 28      2      3 Transfer   Time
6   John   1  2 Map 15      2      3     Text   <NA>
10  John   1  3   Map3      2      4     <NA>   <NA>
13 Sarah   2  4 Map 18      2      3     <NA>   <NA>
16 Sarah   2  5 Map 22      2      3     <NA>   <NA>

с помощью tidyverse вы можете сделать:

 library(tidyverse)
 x%>%
   group_by(ID = cumsum(str_detect(Data,"Map")))%>%
   mutate(time=1:n())%>%
   spread(time,Data)
# A tibble: 5 x 8
# Groups:   ID [5]
  name    Day    ID `1`    `2`   `3`   `4`      `5`  
  <fct> <dbl> <int> <fct>  <fct> <fct> <fct>    <fct>
1 John      1     1 Map 28 2     3     Transfer Time 
2 John      1     2 Map 15 2     3     Text     NA   
3 John      1     3 Map3   2     4     NA       NA   
4 Sarah     2     4 Map 18 2     3     NA       NA   
5 Sarah     2     5 Map 22 2     3     NA       NA   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...