我是 R 的初学者,我所做的几乎所有事情都来自我从其他语言中学到的典型方法。但是,每当我在这里寻找与 R 相关的答案时,代码结构都与我预期的大不相同。

我有一个包含个人面板数据的 data.table。我想查看一个特征的平均结果,然后将样本分成两次:高于平均结果中位数的那些,以及低于平均结果中位数的那些。

这是我的 data.table, yearly 的结构:

       user     wage year
1: 65122111     9.74 2003
2: 65122111     7.85 2004
3: 65122111    97.16 2005
4: 65122111    48.22 2006
5: 65122111    91.24 2007
6: 65122111     9.35 2008
7: 65122112    80.00 2007
8: 65122112     0.00 2008

这就是我所做的:
## get mean wages
meanWages <- yearly[, list(meanWage = mean(wage)), by=(user)]
## split by median
highWage <- meanWages[meanWage > median(meanWages[, meanWage]), user]
lowWage <- meanWages[meanWage < median(meanWages[, meanWage]), user]
## split original sample
yearlyHigh <- yearly[is.element(user,highWage),]
yearlyLow <- yearly[is.element(user,highWage),]

我想这给了我我所期望的(检查正确性非常麻烦),但它似乎非常笨拙且效率低下。做同样事情的更有效和更压缩的方式是什么?

最佳答案

您还可以使用 dplyr 包。可能效率不高,但很容易阅读。

yearly %>%
  group_by(user) %>%
  mutate(meanwage = mean(wage)) %>%
  filter(meanwage >= median(meanwage))

实际拆分数据很少有帮助。只需按工资类别分组,并改用分组操作。
yearly %>%
  group_by(user) %>%
  mutate(meanwage = mean(wage)) %>%
  ungroup %>%
  mutate(cat = ifelse(meanwage >= median(meanwage), "high", "low")) %>%
  group_by(cat) %>%
  do(data.table("further analyses here ..."))

或者只是使用 data.table :
yearly[, meanwage := mean(wage), by=user]
yearly[, cat := ifelse(meanwage >= median(meanwage), "high", "low")]
yearly[, "further analyses here ...", by = cat]

关于R:拆分此样本的更好方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29628439/

10-11 15:44