【问题标题】:How to Use R to Manipulate Data [duplicate]如何使用 R 处理数据
【发布时间】:2014-09-21 07:04:19
【问题描述】:

我正在尝试进行预测分析,其中 x 年的指标将预测 x+1 年。

我想使用 R 在 SQL 中执行相当于 UPDATE 查询的操作。如果我有这样的数据:

x <- c("Randy Watson", "Cleo McDowell", "Darryl Jenks", "Jaffe Joffer",
       "Randy Watson", "Cleo McDowell", "Darryl Jenks", "Jaffe Joffer",
       "Randy Watson", "Cleo McDowell", "Darryl Jenks", "Jaffe Joffer")
y <- c("2012", "2012", "2012", "2012", 
       "2013", "2013", "2013", "2013", 
       "2014", "2014", "2014", "2014")
z <- c(100, 50, 75, 0, 
       110, 75, 0, 25, 
       125, 25, 10, 50)

df <- data.frame(x, y, z)

colnames(df) <- c("Name", "Year", "Sales")

print(df)

            Name Year Sales
1   Randy Watson 2012   100
2  Cleo McDowell 2012    50
3   Darryl Jenks 2012    75
4   Jaffe Joffer 2012     0
5   Randy Watson 2013   110
6  Cleo McDowell 2013    75
7   Darryl Jenks 2013     0
8   Jaffe Joffer 2013    25
9   Randy Watson 2014   125
10 Cleo McDowell 2014    25
11  Darryl Jenks 2014    10
12  Jaffe Joffer 2014    50

我希望最终输出看起来像:

print(df)
           Name YearX YearX1
1  Randy Watson   100   110
2 Cleo McDowell    50    75
3  Darryl Jenks    75     0
4  Jaffe Joffer     0    25

...

如何在 R 中做到这一点?我知道如何在 SQL 中做到这一点(尽管我宁愿不使用 sqldf 除非它是最好的方法)。

谢谢。

编辑: 下面的解决方案并不是我想要的。虽然如果只有两年它可以工作,但我的数据有 10 年。我不需要 Name、Year1、Year2、Year3 等...我只需要 Name、YearX、YearX+1。抱歉,如果我对此不清楚。

【问题讨论】:

  • 您当前的数据格式通常称为“长”,而您的目标称为“宽”。使用这些搜索词,this question should have you covered
  • 你如何定义“YearX”?这是该系列的第一年还是?
  • 关于您的编辑,以及重点;你如何定义“YearX”?

标签: sql r join dplyr sqldf


【解决方案1】:

像这样

# I took the liberty of rearranging your working example a bit   
df <- data.frame(
           Name = c("Randy Watson", "Cleo McDowell", "Darryl Jenks", "Jaffe Joffer",
                    "Randy Watson", "Cleo McDowell", "Darryl Jenks", "Jaffe Joffer"),
           Year = c("2013", "2013", "2013", "2013", "2014", "2014", "2014", "2014"),
           Sales = c(100, 50, 75, 0, 110, 75, 0, 25))

reshape(df, idvar = "Name", timevar = "Year", direction = "wide")

           Name Sales.2013 Sales.2014
1  Randy Watson        100        110
2 Cleo McDowell         50         75
3  Darryl Jenks         75          0
4  Jaffe Joffer          0         25

或密切关注您的问题

df_wide <- reshape(df, idvar = "Name", timevar = "Year", direction = "wide")

colnames(df_wide) <- c("Name", "Year0", "Year1") 

print(df_wide)
           Name Year0 Year1
1  Randy Watson   100   110
2 Cleo McDowell    50    75
3  Darryl Jenks    75     0
4  Jaffe Joffer     0    25

一些应该给你相同结果的替代方法

library(reshape)
cast(df, Name ~ Year)

xtabs(Sales  ~  Name + Year, data = df)

【讨论】:

  • 其实这不是我想要的。如果您的解决方案只有两年时间,您的解决方案就可以工作,但我的数据有 10 年之久。我只想要 YearX 和 YearX+1 在它旁边,就是这样。有意义吗?
  • 这就是为什么提供一个完全反映您的问题的工作示例对您来说很重要的原因。也许您可以扩展您的工作示例?另外,你研究过 Gregor 和 MrFlick 提到的例子吗?
  • 我确实看过这些示例,但它们并不是我想要的。此外,我永远无法直截了当,因为如果我发布“太多”我会受到批评; “太少”也是一样。很难弄清楚金发姑娘区是什么。
  • 我看到,在您之前的一个问题中,MrFlick,om 6 月 3 日 14:16,已经将您指向线程 How to make a great R reproducible example?。你应该研究那个线程。我还要指出How do I ask a good question? 文章。最后,我个人最喜欢 Jon Skeet 的Writing the perfect question。你会得到它的窍门。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2022-11-25
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多