R中列的行值
Row values to columns in R
我是 R 的新手,我正在尝试构建我的第一个回归模型。但是,我正在努力转换我的数据。
我的数据按以下格式组织:
resp_id task_id alt A_1 B_1 C_1 D_1 E_1
1 25 1 3 0.4 0.15 0 0
1 25 2 2 0.7 0.05 0.05 0
1 26 1 1 0.4 0 0 0
1 26 2 3 0.4 0.05 0.1 0.05
我正在寻找一种方法将我的数据从上面的格式转换为下面的格式:
resp_id task_id alt A_1 B_1 C_1 D_1 E_1 A_2 B_2 C_2 D_2 E_2
1 25 1 3 0.4 0.15 0 0 2 0.7 0.05 0.05 0
1 26 1 1 0.4 0 0 0 3 0.4 0.05 0.1 0.05
从概念上讲,我知道我需要遍历每一行,直到我们到达值为 2 的 'alt' 列。然后,该行中的所有下一列值都需要作为新列复制到该行before 和从中复制值的行需要删除。
我研究了在 R 中从长数据集到宽数据集的方法,但我无法将我的数据集转换成我想要的。
鉴于我缺乏编程经验,有人可以帮助我吗?
这是 tidyr
包中 pivot_wider
的工作:
library(tidyverse)
df %>%
# remove the existing suffix and instead use alt to enumerate the columns
rename_at(vars(A_1:E_1), ~gsub("_[0-9]*$", "", .)) %>%
pivot_wider(names_from = alt, values_from = A:E)
结果:
# A tibble: 2 x 12
resp_id task_id A_1 A_2 B_1 B_2 C_1 C_2 D_1 D_2 E_1 E_2
<int> <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 25 3 2 0.4 0.7 0.15 0.05 0 0.05 0 0
2 1 26 1 3 0.4 0.4 0 0.05 0 0.1 0 0.05
前段时间我也在为这样的转变而苦苦挣扎。我一直在寻找最简单的解决方案。在这种情况下,我想推荐 reshape
reshape(df, direction = "wide", timevar = "alt", idvar = "task_id", sep = "")
task_id resp_id1 A_11 B_11 C_11 D_11 E_11 resp_id2 A_12 B_12 C_12 D_12 E_12
1 25 1 3 0.4 0.15 0 0 1 2 0.7 0.05 0.05 0.00
3 26 1 1 0.4 0.00 0 0 1 3 0.4 0.05 0.10 0.05
我是 R 的新手,我正在尝试构建我的第一个回归模型。但是,我正在努力转换我的数据。
我的数据按以下格式组织:
resp_id task_id alt A_1 B_1 C_1 D_1 E_1
1 25 1 3 0.4 0.15 0 0
1 25 2 2 0.7 0.05 0.05 0
1 26 1 1 0.4 0 0 0
1 26 2 3 0.4 0.05 0.1 0.05
我正在寻找一种方法将我的数据从上面的格式转换为下面的格式:
resp_id task_id alt A_1 B_1 C_1 D_1 E_1 A_2 B_2 C_2 D_2 E_2
1 25 1 3 0.4 0.15 0 0 2 0.7 0.05 0.05 0
1 26 1 1 0.4 0 0 0 3 0.4 0.05 0.1 0.05
从概念上讲,我知道我需要遍历每一行,直到我们到达值为 2 的 'alt' 列。然后,该行中的所有下一列值都需要作为新列复制到该行before 和从中复制值的行需要删除。
我研究了在 R 中从长数据集到宽数据集的方法,但我无法将我的数据集转换成我想要的。
鉴于我缺乏编程经验,有人可以帮助我吗?
这是 tidyr
包中 pivot_wider
的工作:
library(tidyverse)
df %>%
# remove the existing suffix and instead use alt to enumerate the columns
rename_at(vars(A_1:E_1), ~gsub("_[0-9]*$", "", .)) %>%
pivot_wider(names_from = alt, values_from = A:E)
结果:
# A tibble: 2 x 12
resp_id task_id A_1 A_2 B_1 B_2 C_1 C_2 D_1 D_2 E_1 E_2
<int> <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 25 3 2 0.4 0.7 0.15 0.05 0 0.05 0 0
2 1 26 1 3 0.4 0.4 0 0.05 0 0.1 0 0.05
前段时间我也在为这样的转变而苦苦挣扎。我一直在寻找最简单的解决方案。在这种情况下,我想推荐 reshape
reshape(df, direction = "wide", timevar = "alt", idvar = "task_id", sep = "")
task_id resp_id1 A_11 B_11 C_11 D_11 E_11 resp_id2 A_12 B_12 C_12 D_12 E_12
1 25 1 3 0.4 0.15 0 0 1 2 0.7 0.05 0.05 0.00
3 26 1 1 0.4 0.00 0 0 1 3 0.4 0.05 0.10 0.05