我有一个文件,其中包含与 ID 的每个唯一值相关联的抑郁的值。名为 HAVE 的数据框如下所示:
id depression friendid_A friendid_B friendid_C friendid_D
1 1.0 NA 3 6 5
2 0.6 6 4 NA NA
3 0.0 1 4 5 NA
4 1.8 1 3 NA 2
5 1.7 NA NA NA NA
6 0.3 2 3 NA NA
我想添加一个变量 depression_sum ,为观察中列出的每个ID查找抑郁的值,然后将它们相加。例如,第一个观察包括其各种 friendid_n 变量的ID 3,6和5。这三个ID的抑郁值分别为0.0,0.3和1.7。因此,这次观察的 depression_sum 将是2.0。
以下是我想要创建的名为 WANT 的数据框:
id depression friendid_A friendid_B friendid_C friendid_D depression_sum
1 1.0 NA 3 6 5 2.0
2 0.6 6 4 NA NA 2.1
3 0.0 1 4 5 NA 4.5
4 1.8 1 3 NA 2 1.6
5 1.7 NA NA NA NA NA
6 0.3 2 3 NA NA 0.6
有没有办法有效地查找这些值并创建一个包含其总和的变量?
答案 0 :(得分:2)
tidyverse
解决方案
library(tidyverse)
WANT <- HAVE %>%
gather(key, value, -id, -depression, na.rm = TRUE) %>%
group_by(id) %>%
summarize(
depression_sum = sum(HAVE$depression[match(value, HAVE$id)])
) %>%
left_join(HAVE, .)
答案 1 :(得分:1)
HAVE <- read.table(text="id depression friendid_1 friendid_2 friendid_3 friendid_4
1 1.0 NA 3 6 5
2 0.6 6 4 NA NA
3 0.0 1 4 5 NA
4 1.8 1 3 NA 2
5 1.7 NA NA NA NA
6 0.3 2 3 NA NA", header=T, sep='', row.names='id')
friends <- HAVE[, 2:ncol(HAVE)]
然后有两种方法:
friends
扩展为邻接矩阵可能更容易)merge()
(SQL连接)。你可以在没有整齐的基础上做到这一点,但这有点痛苦。答案 2 :(得分:1)
可以通过向其添加列来修改HAVE
data.frame本身。也许,需要创建另一个data.frame WANT
(由OP
指定)可以避免。
使用base-R
的{{1}}中的解决方案:
apply