我有大量数据,尝试在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,但是如果有更合适的程序可以使用,我愿意使用它。
感谢您的帮助!
答案 0 :(得分:0)
使用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)
答案 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)]
dcast(dt, V1 ~ V2)
dt[, list(.(V2)), by = V1]
dt[, paste(V2, collapse = " "), by = V1]