我有一個包含多個變數的資料框,這些變數具有相似的結尾(“0m”、“6m”或“12m”)。這些是指資料的月份。一些變數只收集一次,而另一些則在 3 個時間點(“0m”、“6m”或“12m”)。資料如下所示:
wide= data.frame(id = c(1:5),
agree = c("y","n","n","y","y"),
test1_0m = c(2,3,4,3,5),
test1_6m = c(3,5,2,6,7),
test1_12m = c(6,7,8,4,5),
score_0m = c(55,44,33,22,11),
score_6m = c(77,66,55,44,33),
score_12m = c(99,88,77,66,55))
> wide
id agree test1_0m test1_6m test1_12m score_0m score_6m score_12m
1 1 y 2 3 6 55 77 99
2 2 n 3 5 7 44 66 88
3 3 n 4 2 8 33 55 77
4 4 y 3 6 4 22 44 66
5 5 y 5 7 5 11 33 55
我想 pivot_longer獲得一個Month包含0m, 6m, 或12m作為條目的列,以及稱為test1and的列score具有相應人員和月份的結果。
我在這里找到了一個非常有用的答案:https ://stackoverflow.com/questions/69798752/pivot-longer-for-multiple-sets-having-the-same-names-to
但我不知道如何指定正確的regex的值來獲得我想要的值。
我試過這個,這是錯誤的:
wide%>%
pivot_longer(cols = contains("_"),
names_to = c("Month", ".value"),
names_pattern = "(.*\\_)(.*)",
values_drop_na = TRUE )
這是我想要的輸出:
long
id agree Month test1 score
1 1 y 0m 2 55
2 2 n 0m 3 44
3 3 n 0m 4 33
4 4 y 0m 3 22
5 5 y 0m 5 11
6 1 y 6m 3 77
7 2 n 6m 5 66
8 3 n 6m 2 55
9 4 y 6m 6 44
10 5 y 6m 7 33
11 1 y 12m 6 99
12 2 n 12m 7 88
13 3 n 12m 8 77
14 4 y 12m 4 66
15 5 y 12m 5 55
uj5u.com熱心網友回復:
你可以.value在這里使用字符
表示列名的對應組件定義了包含單元格值的輸出列的名稱,完全覆寫 values_to
然后,您還需要使用您的正則運算式定義 2 個捕獲組:
wide %>%
pivot_longer(contains('_'),
names_to = c('.value', 'Month'),
names_pattern = '(\\w )_(\\w )')
# A tibble: 15 × 5
id agree Month test1 score
<int> <chr> <chr> <dbl> <dbl>
1 1 y 0m 2 55
2 1 y 6m 3 77
3 1 y 12m 6 99
4 2 n 0m 3 44
5 2 n 6m 5 66
6 2 n 12m 7 88
7 3 n 0m 4 33
8 3 n 6m 2 55
9 3 n 12m 8 77
10 4 y 0m 3 22
11 4 y 6m 6 44
12 4 y 12m 4 66
13 5 y 0m 5 11
14 5 y 6m 7 33
15 5 y 12m 5 55
uj5u.com熱心網友回復:
我認為您可以只使用names_sep = 而不是names_pattern = ,并且您需要切換名稱的順序(“.value”,“Month”)。
wide %>%
pivot_longer(cols = contains("_"),
names_to = c(".value", "Month"),
names_sep = "_")
結果:
# A tibble: 15 × 5
id agree Month test1 score
<int> <chr> <chr> <dbl> <dbl>
1 1 y 0m 2 55
2 1 y 6m 3 77
3 1 y 12m 6 99
4 2 n 0m 3 44
5 2 n 6m 5 66
6 2 n 12m 7 88
7 3 n 0m 4 33
8 3 n 6m 2 55
9 3 n 12m 8 77
10 4 y 0m 3 22
11 4 y 6m 6 44
12 4 y 12m 4 66
13 5 y 0m 5 11
14 5 y 6m 7 33
15 5 y 12m 5 55
uj5u.com熱心網友回復:
使用data.table
library(data.table)
melt(setDT(wide), measure.vars = measure(value.name, month, sep = "_"))
-輸出
id agree month test1 score
<int> <char> <char> <num> <num>
1: 1 y 0m 2 55
2: 2 n 0m 3 44
3: 3 n 0m 4 33
4: 4 y 0m 3 22
5: 5 y 0m 5 11
6: 1 y 6m 3 77
7: 2 n 6m 5 66
8: 3 n 6m 2 55
9: 4 y 6m 6 44
10: 5 y 6m 7 33
11: 1 y 12m 6 99
12: 2 n 12m 7 88
13: 3 n 12m 8 77
14: 4 y 12m 4 66
15: 5 y 12m 5 55
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/524536.html
上一篇:將ICD10代碼從一行擴展為多行
下一篇:將多列添加到R資料框時出錯
