我想區分第 1 列和第 2 列、第 3 列和第 4 列、第 5 列和第 6 列、第 7 列和第 8 列等等。我最初有 55 個對應的列對(總共 110 列),需要獲得 55 個不同的列。我最終手動編碼了每一列的差異,但我認為我可能可以更有效地做到這一點。也許通過在 SAS 中使用陣列。我也想在 r 中解決這個問題。
合成資料如下,如果有人知道如何快速生成順序成對的列名,如 var1_apple、var1_banana、var2_apple、var2_banana、var3_apple、var3_banana、...,在 r 中(不只是輸入列名的向量),那將是非常也很有幫助。
謝謝!
## create a dataframe with random values of 1:10. ncols x nrows = 200
df <- data.frame(matrix(sample(1:10, 200, replace = TRUE), ncol = 20, nrow = 10))
uj5u.com熱心網友回復:
編輯——在底部添加了“55 個差異列”部分。
將資料調整為列對:
df <- data.frame(matrix(sample(1:10, 200, replace = TRUE), ncol = 20, nrow = 10))
names(df) <- paste0("var", rep(1:10, each = 2), "_", rep(c("apple", "banana")))
names(df)
[1] "var1_apple" "var1_banana" "var2_apple" "var2_banana" "var3_apple" "var3_banana"
[7] "var4_apple" "var4_banana" "var5_apple" "var5_banana" "var6_apple" "var6_banana"
[13] "var7_apple" "var7_banana" "var8_apple" "var8_banana" "var9_apple" "var9_banana"
[19] "var10_apple" "var10_banana"
library(tidyverse)
df %>%
mutate(row = row_number()) %>%
pivot_longer(-row, names_to = c("var", ".value"), names_sep = "_")
# A tibble: 100 × 4
row var apple banana
<int> <chr> <int> <int>
1 1 var1 8 7
2 1 var2 4 9
3 1 var3 7 3
4 1 var4 6 10
5 1 var5 10 10
6 1 var6 1 1
7 1 var7 2 10
8 1 var8 7 9
9 1 var9 3 8
10 1 var10 2 6
# … with 90 more rows
# ? Use `print(n = ...)` to see more rows
這是添加所有散布的差異列的變體:
df %>%
mutate(row = row_number()) %>%
pivot_longer(-row, names_to = c("var", ".value"), names_sep = "_") %>%
mutate(difference = banana - apple) %>%
pivot_wider(names_from = var, values_from = apple:difference,
names_glue = "{var}_{.value}", names_vary = "slowest")
結果(截斷)
# A tibble: 10 × 10
row var1_apple var1_banana var1_difference var2_apple var2_banana var2_difference var3_apple var3_banana var3_difference
<int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 1 7 10 3 5 3 -2 1 9 8
2 2 9 2 -7 3 6 3 8 1 -7
3 3 2 10 8 3 3 0 7 8 1
4 4 3 1 -2 8 3 -5 9 9 0
5 5 2 7 5 7 10 3 6 9 3
6 6 5 4 -1 2 1 -1 5 4 -1
7 7 4 5 1 10 3 -7 9 4 -5
8 8 10 7 -3 3 2 -1 5 9 4
9 9 5 5 0 7 3 -4 10 7 -3
10 10 10 6 -4 1 4 3 10 10 0
uj5u.com熱心網友回復:
我認為@Tom 的評論很到位。如果您正在處理配對資料,那么重組資料可能是有意義的。例如:
od <- names(df)[c(TRUE,FALSE)]
ev <- names(df)[c(FALSE,TRUE)]
data.frame(
odd = unlist(df[od]),
oddname = rep(od,each=nrow(df)),
even = unlist(df[ev]),
evenname = rep(ev,each=nrow(df))
)
## odd oddname even evenname
##X11 7 X1 10 X2
##X12 6 X1 1 X2
##X13 2 X1 6 X2
##X14 5 X1 2 X2
##X15 3 X1 1 X2
## ...
然后在這個結構中從另一列中取一列是很簡單的。
如果您必須具有類似矩陣的輸出,那么這也是可以實作的:
od <- names(df)[c(TRUE,FALSE)]
ev <- names(df)[c(FALSE,TRUE)]
setNames(df[od] - df[ev], paste(od, ev, sep="_"))
## X1_X2 X3_X4 X5_X6 X7_X8 X9_X10 X11_X12 X13_X14 X15_X16 X17_X18 X19_X20
##1 -3 2 4 4 -2 4 3 1 -3 9
##2 5 5 4 3 -1 3 -1 -3 5 -2
##3 -4 3 7 4 -5 1 1 5 -4 4
##4 3 0 6 3 4 -5 6 6 -7 4
##5 2 2 1 4 -6 -3 6 2 3 1
##6 -6 -2 4 -2 0 1 3 0 0 -7
##7 0 -6 3 7 -1 0 0 -5 3 1
##8 -1 3 3 1 2 -2 -5 3 0 0
##9 -4 1 -5 -2 -4 7 6 -2 4 -4
##10 2 -7 4 -1 0 -6 -4 -4 0 0
uj5u.com熱心網友回復:
編輯:喬恩的更新答案解決了我卡住的部分。
我有一個類似的問題,并盡我所能跳到@Jon 的答案:
如果這是配對資料,包括受試者和試驗次數:
library(tidyverse)
df <- data.frame(matrix(sample(1:10, 200, replace = TRUE), ncol = 20, nrow = 10))
names(df) <- paste0("var", rep(1:10, each = 2), "_", rep(c("apple", "banana")))`
添加身份證
ID <- LETTERS[1:10]
df <- cbind(ID, df)
使其更長并重新分配回資料框以進行數學運算
df <- df %>% pivot_longer(-ID, names_to = c("var", ".value"), names_sep = "_")
算一算
df$difference <- df$apple-df$banana
但是,輕松取回矩陣的最后一部分是我陷入困境的地方,目的是獲得一些在概念上傳達這一點的東西
ID apple1 banana1 sugardiff1 apple2 banana2 sugardiff2
A 10 8 2 7 4 3
而不是將差異作為“長”格式的一列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511149.html
標籤:r数组循环sas
上一篇:從多個列與多個列創建列聯表
