【问题标题】:Transforming row-wise data into columnwise data in r [duplicate]在r中将行数据转换为列数据
【发布时间】:2015-07-29 11:33:13
【问题描述】:

我有一个以 csv 格式存储点击流的文件。 数据如下所示:

Row 1. User1 - Click1

Row 2. User1 - Click2

Row 3. User1 - Click3

Row 4. User2 - Click1

Row 5. User3 - Click1

Row 6. User3 - Click2

等等

r中是否有函数可以将数据赋予以下形式

Row 1. User1- Click1 - Click2 - Click3

Row 2. User2 - Click1

Row 3. User3 - Click1 - Click2

谢谢

【问题讨论】:

  • 您的数据看起来如何并不是很有用。我们需要知道确切的数据结构。请阅读this FAQ。您还应该展示自己为解决此问题所做的一些努力。
  • 好的,罗兰。谢谢。会接受的

标签: r


【解决方案1】:

这可以是一种选择

library(splitstackshape)
cSplit(setDT(df)[, toString(V4), by='V3'], 'V1', ',')

#      V3    V1_1    V1_2    V1_3
#1: User1 -Click1 -Click2 -Click3
#2: User2 -Click1      NA      NA
#3: User3 -Click1 -Click2      NA

数据

df = structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Row", class = "factor"), 
    V2 = c(1, 2, 3, 4, 5, 6), V3 = structure(c(1L, 1L, 1L, 2L, 
    3L, 3L), .Label = c("User1", "User2", "User3"), class = "factor"), 
    V4 = structure(c(1L, 2L, 3L, 1L, 1L, 2L), .Label = c("-Click1", 
    "-Click2", "-Click3"), class = "factor")), .Names = c("V1", 
"V2", "V3", "V4"), class = "data.frame", row.names = c(NA, -6L
))

【讨论】:

  • 感谢维伦德拉。不,数据不是数据框。任何用户的点击次数从 1 到 10,000 不等
【解决方案2】:
library(reshape2)
df <- data.frame(user = rep(LETTERS[1:3], each = 3), click = rep(1:3, times = 3))
dfmelt <- melt(df, id = "user")
dfcast <- dcast(dfmelt, user ~ variable + value)

这是玩具数据:

> df
  user click
1    A     1
2    A     2
3    A     3
4    B     1
5    B     2
6    B     3
7    C     1
8    C     2
9    C     3

结果如下:

> dfcast
  user click_1 click_2 click_3
1    A       1       2       3
2    B       1       2       3
3    C       1       2       3

您也可以在一行中完成此操作,但您不会得到漂亮的列名:

> dcast(df, user ~ click)

  user 1 2 3
1    A 1 2 3
2    B 1 2 3
3    C 1 2 3

【讨论】:

  • 谢谢 ulfelder。在这种情况下,问题是我无法将点击次数的值设置为 3,因为每个用户的点击次数不同
  • 点击次数不必在用户之间保持不变即可。如果数字不均匀,dcast() 会将 NA 放入附加项中。因此,如果用户 A 有 n 次点击而用户 B 有 n - 2 次点击,您将在用户 B 的最后两列中获得 NA。换句话说,它会执行与 splitstackshape 在这些条件下所做的相同的事情。跨度>
【解决方案3】:

拥有这个数据框,使用reshape函数:

   user   click
1 User1 -Click1
2 User1 -Click2
3 User1 -Click3
4 User2 -Click1
5 User3 -Click1
6 User3 -Click2

df$n <- df$click
reshape(df, idvar="user", timevar="click" ,direction="wide")

输出:

   user n.-Click1 n.-Click2 n.-Click3
1 User1   -Click1   -Click2   -Click3
4 User2   -Click1      <NA>      <NA>
5 User3   -Click1   -Click2      <NA>

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 2022-06-10
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多