如果两个字符串在 R 中的两个不同数据帧中匹配,则分配一个值并求和
Assigning a value and sum up if two strings match in two different data frames in R
我进行了一项大型调查(包括针对不同治疗的 42 项子调查),但无法整理我的数据。
我有大约 16 000 个答案,每个答案(即报纸的另一种用途)是数据框中的一个单元格。这些答案以数据 1(下方)的形式出现。
根据回答的次数,0-6分(分数越多,想出来的人越少,回答越有创意)。
此列表在形式上与数据 2(在下面列出)相同。
现在我想根据数据 2 中的细分对 42 项调查(=参与者)中每一项的每一行求和。这个分数应该是数据框中称为“分数”的额外列。
简单示例:
参与者 1 的回答:“schuhe”,“basteln”,... => 分数 = 1 + 0 分 = 1
参与者 2 个答案:“brennmaterial”、“schiff”、... => 分数 = 1 + 1 分 = 2
所以代码应该这样做:
- 如果数据 1 的单元格 x 中的字符串(例如“schuhe”)与数据 2 中第 1 列中的字符串(此处为:“schuhe”)匹配(它总是匹配,因为数据 2 是 table created out of data 1), pick the value corresponding to the matching string in the data 2 of the column "points", 将其保存在内存中或分配给变量。
- 转到行中的下一个单元格,执行第 1 步。
- 如果名称为“mycolumns”的所有列在一行中完成,则总结点。
- 在数据 1 的“score”列中写入总分。
- 对下一行重复。
数据 1:
42 项调查中的 1 项给出的答案(片段):
structure(list(id = c("1", "2", "3", "4", "7"), kreazeitung_SQ001 = c("fensterglasersatz",
"dämmmaterial", "klopapier", NA, NA), kreazeitung_SQ002 = c("einwickeln",
"brennmaterial", "feueranzünder", "putzlappen", "schlagen"),
kreazeitung_SQ003 = c("mülleimer", "flieger", "brennmaterial",
"brennmaterial", "abdecken"), kreazeitung_SQ004 = c("schuhe",
"regenschirm", "basteln", "pappmaschee", "unterlage")), class = "data.frame", row.names = c(NA,
-5L))
数据2:以下是每个答案的价值点,例如如果在数据1中答案是“hut”,这个数据中的“points”栏告诉我它值0分,如果是“schuhe”,它应该打1分。
structure(list(Var1 = c("basteln", "einwickeln", "abdecken",
"falten", "schlagen", "feueranzünder", "hut", "unterlage", "collage",
"fliegenklatsche", "geschenkpapier", "pappmaschee", "zerreißen",
"brennmaterial", "schiff", "schuhe"), Freq = c(57L, 55L, 46L,
45L, 43L, 42L, 42L, 42L, 41L, 41L, 41L, 41L, 40L, 39L, 39L, 39L
), points = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1)), row.names = c(9L,
30L, 1L, 42L, 151L, 47L, 81L, 192L, 20L, 53L, 67L, 126L, 211L,
16L, 150L, 156L), class = "data.frame")
我对所有解决方案都很满意,无论是 base 还是 tidyverse。
不幸的是,这种代码的复杂性超出了我的理解,所以我会很高兴得到任何帮助!!
谢谢!
如果我理解的话,那么 d2$Var1
中的值与 d1
中的所有列 Q 匹配。如果是这样,我认为这会起作用,其中 d1 是数据 1,d2 是数据 2
# using data.table package for operations
library(data.table)
d1 <- as.data.table(d1)
d2 <- as.data.table(d2)
# convert from wide format to long
d1_long <- melt(d1, id.vars = "id")
# then can use merge operations to pull the points across
d1_long <- merge(d1_long, d2, by.x="value", by.y="Var1", all.x=TRUE)
# lots of missing values in the e.g., so filled with 0
d1_long[is.na(points), points := 0]
# aggregate the scores, by id
scores <- d1_long[, .(score=sum(points)), by=id]
# add them back in to the original data, sort=FALSE preserves order
d1 <- merge(d1, scores, by="id", sort=FALSE)
d1
id kreazeitung_SQ001 kreazeitung_SQ002 kreazeitung_SQ003
1: 1 fensterglasersatz einwickeln mülleimer
2: 2 dämmmaterial brennmaterial flieger
3: 3 klopapier feueranzünder brennmaterial
4: 4 <NA> putzlappen brennmaterial
5: 7 <NA> schlagen abdecken
kreazeitung_SQ004 score
1: schuhe 1
2: regenschirm 1
3: basteln 1
4: pappmaschee 1
5: unterlage 0
# to convert back to data.frame
d1.df <- as.data.frame(d1)
我进行了一项大型调查(包括针对不同治疗的 42 项子调查),但无法整理我的数据。
我有大约 16 000 个答案,每个答案(即报纸的另一种用途)是数据框中的一个单元格。这些答案以数据 1(下方)的形式出现。
根据回答的次数,0-6分(分数越多,想出来的人越少,回答越有创意)。 此列表在形式上与数据 2(在下面列出)相同。
现在我想根据数据 2 中的细分对 42 项调查(=参与者)中每一项的每一行求和。这个分数应该是数据框中称为“分数”的额外列。
简单示例:
参与者 1 的回答:“schuhe”,“basteln”,... => 分数 = 1 + 0 分 = 1
参与者 2 个答案:“brennmaterial”、“schiff”、... => 分数 = 1 + 1 分 = 2
所以代码应该这样做:
- 如果数据 1 的单元格 x 中的字符串(例如“schuhe”)与数据 2 中第 1 列中的字符串(此处为:“schuhe”)匹配(它总是匹配,因为数据 2 是 table created out of data 1), pick the value corresponding to the matching string in the data 2 of the column "points", 将其保存在内存中或分配给变量。
- 转到行中的下一个单元格,执行第 1 步。
- 如果名称为“mycolumns”的所有列在一行中完成,则总结点。
- 在数据 1 的“score”列中写入总分。
- 对下一行重复。
数据 1: 42 项调查中的 1 项给出的答案(片段):
structure(list(id = c("1", "2", "3", "4", "7"), kreazeitung_SQ001 = c("fensterglasersatz",
"dämmmaterial", "klopapier", NA, NA), kreazeitung_SQ002 = c("einwickeln",
"brennmaterial", "feueranzünder", "putzlappen", "schlagen"),
kreazeitung_SQ003 = c("mülleimer", "flieger", "brennmaterial",
"brennmaterial", "abdecken"), kreazeitung_SQ004 = c("schuhe",
"regenschirm", "basteln", "pappmaschee", "unterlage")), class = "data.frame", row.names = c(NA,
-5L))
数据2:以下是每个答案的价值点,例如如果在数据1中答案是“hut”,这个数据中的“points”栏告诉我它值0分,如果是“schuhe”,它应该打1分。
structure(list(Var1 = c("basteln", "einwickeln", "abdecken",
"falten", "schlagen", "feueranzünder", "hut", "unterlage", "collage",
"fliegenklatsche", "geschenkpapier", "pappmaschee", "zerreißen",
"brennmaterial", "schiff", "schuhe"), Freq = c(57L, 55L, 46L,
45L, 43L, 42L, 42L, 42L, 41L, 41L, 41L, 41L, 40L, 39L, 39L, 39L
), points = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1)), row.names = c(9L,
30L, 1L, 42L, 151L, 47L, 81L, 192L, 20L, 53L, 67L, 126L, 211L,
16L, 150L, 156L), class = "data.frame")
我对所有解决方案都很满意,无论是 base 还是 tidyverse。 不幸的是,这种代码的复杂性超出了我的理解,所以我会很高兴得到任何帮助!! 谢谢!
如果我理解的话,那么 d2$Var1
中的值与 d1
中的所有列 Q 匹配。如果是这样,我认为这会起作用,其中 d1 是数据 1,d2 是数据 2
# using data.table package for operations
library(data.table)
d1 <- as.data.table(d1)
d2 <- as.data.table(d2)
# convert from wide format to long
d1_long <- melt(d1, id.vars = "id")
# then can use merge operations to pull the points across
d1_long <- merge(d1_long, d2, by.x="value", by.y="Var1", all.x=TRUE)
# lots of missing values in the e.g., so filled with 0
d1_long[is.na(points), points := 0]
# aggregate the scores, by id
scores <- d1_long[, .(score=sum(points)), by=id]
# add them back in to the original data, sort=FALSE preserves order
d1 <- merge(d1, scores, by="id", sort=FALSE)
d1
id kreazeitung_SQ001 kreazeitung_SQ002 kreazeitung_SQ003
1: 1 fensterglasersatz einwickeln mülleimer
2: 2 dämmmaterial brennmaterial flieger
3: 3 klopapier feueranzünder brennmaterial
4: 4 <NA> putzlappen brennmaterial
5: 7 <NA> schlagen abdecken
kreazeitung_SQ004 score
1: schuhe 1
2: regenschirm 1
3: basteln 1
4: pappmaschee 1
5: unterlage 0
# to convert back to data.frame
d1.df <- as.data.frame(d1)