我進行了一項大型調查(包括針對不同治療的 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 是從資料 1 創建的表),選擇與“points”列的資料 2 中匹配字串對應的值,將其保存在記憶體中或分配給變數。
- 轉到行中的下一個單元格,執行步驟 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中的答案是“小屋”,則該資料中的“分數”列告訴我它值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。不幸的是,這種代碼復雜性超出了我的想象,所以我會為任何幫助感到興奮!!謝謝!
uj5u.com熱心網友回復:
如果我理解,那么 中的值d2$Var1與 中的所有列 Q 相匹配d1。如果是這樣,我認為這會起作用,其中 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/390459.html
上一篇:查找一列逗號分隔類別的組合
