Использование уникальных идентификаторов для создания пользовательской строки, R - PullRequest
0 голосов
/ 14 июня 2019

У меня большой набор данных, и я столкнулся с проблемой при попытке организовать его в R. Мне нужно, чтобы мои данные были в длинной строке, а не в столбце. У меня есть один столбец с идентификаторами пользователей и другой столбец, полный данных. Существует один идентификатор пользователя на X количество записей. Есть ли способ повернуть ячейки в столбце в соответствии с индивидуальным идентификатором? Я также хотел бы, чтобы каждое из значений находилось в отдельной ячейке для каждого идентификатора.

Вот как теперь выглядят данные:

user1 123  
na     234
na     345
user2 455
na     678
user3 87
na      987
user4 676
na    456
na    78
na    356

И вот что я хочу сделать:

User 1  123 124 142 345 23  343
User 2  534 56              
User 3  7567 354 7667 56        
User 4  34  

В настоящее время я использую R для большей части моего анализа, но если есть программа, которая лучше подходит для использования, я открыт для ее использования.

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

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

# load packages
library(data.table)

# create data
dt <- fread("user1 123
na     234
na     345
user2 455
na     678
user3 87
na      987
user4 676
na    456
na    78
na    356")

# change the character string na to real NAs
dt[V1 == "na", V1 := NA]

# fill in the empty cells with the last observed value
library(zoo)
dt[, V1 := na.locf(V1)]

Теперь часть форматирования:

Используемая альтернатива 1 (хотя она отличается от ожидаемого результата, она все еще может использоваться для некоторых целей)

dcast(dt, V1 ~ V2)

Используемая альтернатива 2: поместить все значения V2 в список:

dt[, list(.(V2)), by = V1]

Вариант печати 3: вставьте все значения, имеющие длинную строку (это наиболее похоже на ожидаемый результат):

dt[, paste(V2, collapse = "  "), by = V1]
0 голосов
/ 14 июня 2019

С dplyr и tidyr вы можете сделать:

df %>%
 fill(V1) %>%
 group_by(V1) %>%
 summarise(V2 = toString(V2))

  V1    V2               
  <chr> <chr>            
1 user1 123, 234, 345    
2 user2 455, 678         
3 user3 87, 987          
4 user4 676, 456, 78, 356

Или:

df %>%
 fill(V1) %>%
 group_by(V1) %>%
 summarise(V2 = paste(V2, collapse = ", "))

Пример данных:

df <- read.table(text = "user1 123  
na     234
                 na     345
                 user2 455
                 na     678
                 user3 87
                 na      987
                 user4 676
                 na    456
                 na    78
                 na    356", header = FALSE,
                 na.strings = c("na"),
                 stringsAsFactors = FALSE)

Или иметь дело с na после прочтения данных в:

df %>%
 mutate(V1 = na_if(V1, "na")) %>%
 fill(V1) %>%
 group_by(V1) %>%
 summarise(V2 = toString(V2))

Пример данных:

df <- read.table(text = "user1 123  
na     234
                 na     345
                 user2 455
                 na     678
                 user3 87
                 na      987
                 user4 676
                 na    456
                 na    78
                 na    356", header = FALSE,
                 stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...