dplyr:将一行数据框重新排列为多行
dplyr: rearrange one row dataframe to multiple rows
我有几个小数据框,每个数据框都有一行是中介分析的结果。我需要将单元格重新排列为三行,每行有两个变量及其相应的系数。示例如下:
有数据:
lab_x lab_m lab_y coef_xm coef_my coef_xy
x m y -0.21*** 0.08*** -0.084***
想要数据:
var1 var2 coef
x m -0.21***
m y 0.08***
x y -0.084***
更新
数据略有改动,需要保留原来在DF中出现的变量名
df<-read.table(text="lab_x lab_m lab_y coef_xm coef_my coef_xy
v1 v2 v3 -0.21*** 0.08*** -0.084***", header = TRUE)
想要:
var1 var2 coef
v1 v2 -0.21***
v2 v3 0.08***
v1 v3 -0.084***
在 base R 中,您可以提取系数列的名称,获取相应的 lab
名称并创建数据框。
col1 <- grep('coef', names(df), value = TRUE)
col2 <- sub('coef_', '', fixed = TRUE, cols)
do.call(rbind, lapply(strsplit(col2, ''), function(x)
setNames(df[paste0('lab_', x)], c('var1', 'var2')))) |>
transform(coef = unlist(df[col1], use.names = FALSE))
# var1 var2 coef
#1 v1 v2 -0.21***
#2 v2 v3 0.08***
#3 v1 v3 -0.084***
如果数据采用一致的格式,您可以对整形进行硬编码:
data.frame(var1 = c(df[1,1], df[1,2], df[1,1]),
var2 = c(df[1,2], df[1,3], df[1,3]),
coef = as.character(df[1,4:6]))
var1 var2 coef
1 v1 v2 -0.21***
2 v2 v3 0.08***
3 v1 v3 -0.084***
或更隐晦:
v <- \(i) {as.character(df[1,i])}
data.frame(var1 = v(c(1,2,1)), var2 = v(c(2,3,3)), coef = v(c(4:6)))
我有几个小数据框,每个数据框都有一行是中介分析的结果。我需要将单元格重新排列为三行,每行有两个变量及其相应的系数。示例如下:
有数据:
lab_x lab_m lab_y coef_xm coef_my coef_xy
x m y -0.21*** 0.08*** -0.084***
想要数据:
var1 var2 coef
x m -0.21***
m y 0.08***
x y -0.084***
更新
数据略有改动,需要保留原来在DF中出现的变量名
df<-read.table(text="lab_x lab_m lab_y coef_xm coef_my coef_xy
v1 v2 v3 -0.21*** 0.08*** -0.084***", header = TRUE)
想要:
var1 var2 coef
v1 v2 -0.21***
v2 v3 0.08***
v1 v3 -0.084***
在 base R 中,您可以提取系数列的名称,获取相应的 lab
名称并创建数据框。
col1 <- grep('coef', names(df), value = TRUE)
col2 <- sub('coef_', '', fixed = TRUE, cols)
do.call(rbind, lapply(strsplit(col2, ''), function(x)
setNames(df[paste0('lab_', x)], c('var1', 'var2')))) |>
transform(coef = unlist(df[col1], use.names = FALSE))
# var1 var2 coef
#1 v1 v2 -0.21***
#2 v2 v3 0.08***
#3 v1 v3 -0.084***
如果数据采用一致的格式,您可以对整形进行硬编码:
data.frame(var1 = c(df[1,1], df[1,2], df[1,1]),
var2 = c(df[1,2], df[1,3], df[1,3]),
coef = as.character(df[1,4:6]))
var1 var2 coef
1 v1 v2 -0.21***
2 v2 v3 0.08***
3 v1 v3 -0.084***
或更隐晦:
v <- \(i) {as.character(df[1,i])}
data.frame(var1 = v(c(1,2,1)), var2 = v(c(2,3,3)), coef = v(c(4:6)))