查找和求和与不同 ID 关联的值
lookup and sum values associated with different IDs
我有一个文件,其中包含与 ID 的每个唯一值关联的 depression 值。名为 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 的 depression 值, 并将它们相加。例如,第一个观察包括其各种 friendid_n 变量的 ID 3、6 和 5。这三个 ID 的 depression 值分别为 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
有没有办法有效地查找这些值并创建一个包含它们总和的变量?
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, .)
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)]
那么有两条路可以走:
- 按行扫描匹配函数,它在每一行中查找 1,2,3... 的匹配项。 (先把
friends
展开成邻接矩阵可能更容易)
- 根据@MelissaKey 的建议在 'id' 上使用
merge()
(SQL 加入)。您可以在没有 tidyverse 的情况下在 base 中执行此操作,但这有点痛苦。
可以通过向其添加一列来修改 HAVE
data.frame 本身。也许,可以避免需要创建另一个 data.frame WANT
(由 OP
指定)。
base-R
中使用 apply
的解决方案:
HAVE$depression_sum <- apply(df[3:nrow(df)], 1,
function(x)sum(df$depression[HAVE$id %in% x], na.rm = TRUE))
HAVE
# id depression friendid_A friendid_B friendid_C friendid_D depression_sum
# 1 1 1.0 NA 3 6 5 2.0
# 2 2 0.6 6 4 NA NA 2.1
# 3 3 0.0 1 4 5 NA 4.5
# 4 4 1.8 1 3 NA 2 1.6
# 5 5 1.7 NA NA NA NA 0.0
# 6 6 0.3 2 3 NA NA 0.6
我有一个文件,其中包含与 ID 的每个唯一值关联的 depression 值。名为 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 的 depression 值, 并将它们相加。例如,第一个观察包括其各种 friendid_n 变量的 ID 3、6 和 5。这三个 ID 的 depression 值分别为 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
有没有办法有效地查找这些值并创建一个包含它们总和的变量?
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, .)
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)]
那么有两条路可以走:
- 按行扫描匹配函数,它在每一行中查找 1,2,3... 的匹配项。 (先把
friends
展开成邻接矩阵可能更容易) - 根据@MelissaKey 的建议在 'id' 上使用
merge()
(SQL 加入)。您可以在没有 tidyverse 的情况下在 base 中执行此操作,但这有点痛苦。
可以通过向其添加一列来修改 HAVE
data.frame 本身。也许,可以避免需要创建另一个 data.frame WANT
(由 OP
指定)。
base-R
中使用 apply
的解决方案:
HAVE$depression_sum <- apply(df[3:nrow(df)], 1,
function(x)sum(df$depression[HAVE$id %in% x], na.rm = TRUE))
HAVE
# id depression friendid_A friendid_B friendid_C friendid_D depression_sum
# 1 1 1.0 NA 3 6 5 2.0
# 2 2 0.6 6 4 NA NA 2.1
# 3 3 0.0 1 4 5 NA 4.5
# 4 4 1.8 1 3 NA 2 1.6
# 5 5 1.7 NA NA NA NA 0.0
# 6 6 0.3 2 3 NA NA 0.6