2

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

   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 表示身高)。任何在高度有时缺失时仍然有效的解决方案将不胜感激。

谢谢!

4

1 回答 1

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))
于 2013-05-23T00:45:00.287 回答