使用唯一ID创建用户行,R

时间:2019-06-14 18:13:01

标签: r

我有大量数据,尝试在R中组织数据时遇到问题。我需要数据以长字符串而不是列的形式出现。我有一列包含用户ID,另一列包含完整的数据。每X个条目有一个用户ID。有没有一种方法可以根据个人ID旋转列中的单元格?我还希望每个值都在每个ID的单个单元格中。

这是现在的数据:

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 :(得分:0)

使用dplyrtidyr,您可以执行以下操作:

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)

答案 1 :(得分:0)

我不确定数据重新格式化后要如何处理,无论如何,它仍然几乎无法使用。

# 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]