【问题标题】:Assign values from one member of a group to another in R将值从组的一个成员分配给 R 中的另一个
【发布时间】:2013-05-18 05:03:20
【问题描述】:

我有兄弟姐妹的身高数据,这些兄弟姐妹分别嵌套在两个兄弟姐妹的家庭中:

   ID family sibling height
1   1      1       1    103
2   2      1       2    100
3   3      2       1    102
4   4      2       2     98
5   5      3       1    104
6   6      3       2    100
7   7      4       1     98
8   8      4       2     94
9   9      5       1     95
10 10      5       2    111
11 11      6       1    112
12 12      6       2    113

使用 R,在每个家庭中,我想创建一个新变量,每个兄弟姐妹分配他或她的共同兄弟姐妹的身高值,如下所示:

   ID family sibling height cosib_height
1   1      1       1    103          100
2   2      1       2    100          103
3   3      2       1    102           98
4   4      2       2     98          102
5   5      3       1    104          100
6   6      3       2    100          104
7   7      4       1     98           94
8   8      4       2     94           98
9   9      5       1     95          111
10 10      5       2    111           95
11 11      6       1    112          113
12 12      6       2    113          112

很容易对家庭的两个成员进行汇总,例如求每个家庭的平均身高,但我无法弄清楚如何为每个人分配他或她的兄弟姐妹的身高。

我怀疑它可以使用 reshape 或 plyr 包来完成,但到目前为止我没有运气。

编辑:另一个复杂情况是,在我使用的真实数据中,有时一个家庭中的一个或两个兄弟姐妹会丢失身高数据(NA 表示身高)。任何在高度有时缺失时仍然有效的解决方案将不胜感激。

谢谢!

【问题讨论】:

  • 当一个高度为 NA 时会发生什么?两者都不适用?

标签: r plyr reshape


【解决方案1】:

如果您的数据被称为 dat 这有效:

dat$cosib_height <- unlist(lapply(split(dat$height, dat$family), rev))

##    ID family sibling height cosib_height
## 1   1      1       1    103          100
## 2   2      1       2    100          103
## 3   3      2       1    102           98
## 4   4      2       2     98          102
## 5   5      3       1    104          100
## 6   6      3       2    100          104
## 7   7      4       1     98           94
## 8   8      4       2     94           98
## 9   9      5       1     95          111
## 10 10      5       2    111           95
## 11 11      6       1    112          113
## 12 12      6       2    113          112

一个变种:

dat <- transform(dat, cosib_height = ave(height, family, FUN=rev))

【讨论】:

  • @flodel 为什么不把它作为第二个响应扔掉呢?这样更好。
  • 嗯,它们非常相似,你应该得到分组和应用rev的积分。
  • 这两种解决方案都非常出色!谢谢你们俩!很抱歉,我的代表仍然太低而无法投票,但我已将此标记为最佳答案。
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多