从缺少某些值的列表数据在 R 中创建数据框

发布于 2024-12-02 12:26:35 字数 332 浏览 0 评论 0原文

我有一个 CSV,其中包含一长串数据,如下所示:

Date    user_id    value
4/1       1           5
4/1       2           3
4/1       3           10
4/2       1           1
4/2       3           7

我想将其移动到一个数据框中,该数据框中只有一列用户 ID 和一列每个日期。我假设有一种方法可以处理 sapplylapply 但我不确定如何处理用户 ID 并不总是在每个日期都存在。

I have a CSV with a long list of data that looks like this:

Date    user_id    value
4/1       1           5
4/1       2           3
4/1       3           10
4/2       1           1
4/2       3           7

and I want to move it into a data frame that just has one column of user id's and a column for each date. I'm assuming there is a way to do with with sapply or lapply but I'm not sure how to handle that the user id's don't always exist for every date.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

韶华倾负 2024-12-09 12:26:35

也许使用 reshape 如下所示,假设您的数据存储在 dat 中:

reshape(dat,v.names = "value",idvar = "user_id",
        direction = "wide",timevar = "Date")

  user_id value.4/1 value.4/2
1       1         5         1
2       2         3        NA
3       3        10         7

或者也许更简单,使用 reshape2 中的 dcast

dcast(dat,user_id~Date)

  user_id 4/1 4/2
1       1   5   1
2       2   3  NA
3       3  10   7

Maybe something using reshape like the following, which assumes your data are stored in dat:

reshape(dat,v.names = "value",idvar = "user_id",
        direction = "wide",timevar = "Date")

  user_id value.4/1 value.4/2
1       1         5         1
2       2         3        NA
3       3        10         7

Or perhaps more simply, use dcast from reshape2:

dcast(dat,user_id~Date)

  user_id 4/1 4/2
1       1   5   1
2       2   3  NA
3       3  10   7
剧终人散尽 2024-12-09 12:26:35

这也是 tidyr::spread 非常方便地完成的事情

require(tidyr)
require(dplyr)

df <- data.frame("Date" = rep(c("Nov", "Dec"), each = 3), 
             "user.id" = rep(1:3, 2),
             "value" = rnorm(6))

df.2 <- df %>% 
spread(Date, value)

df.2
  user.id        Dec       Nov
     1      -1.9094765   -1.101037
     2       0.2358694   -1.418151
     3      -0.4297790   -1.426573

This is also something that tidyr::spread does quite conveniently

require(tidyr)
require(dplyr)

df <- data.frame("Date" = rep(c("Nov", "Dec"), each = 3), 
             "user.id" = rep(1:3, 2),
             "value" = rnorm(6))

df.2 <- df %>% 
spread(Date, value)

df.2
  user.id        Dec       Nov
     1      -1.9094765   -1.101037
     2       0.2358694   -1.418151
     3      -0.4297790   -1.426573
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文