如何解决用于折叠从宽格式到长格式的不同列的多个范围的 R 函数? 数据
我有一个数据集,每行中有多个不同范围的列(每行对应一个人),如下所示。不同列类型的每个实例都有 3 个级别(0,1 和 2)。
id col1_0 col1_1 col1_2 col2_0 col2_1 col2_2 col3_0 col3_1 col3_2
1 0 1 3 2 2 3 3 4 5
2 1 1 2 2 4 7 4 5 5
.
.
etc.
我需要的是将所有 col1 折叠到一个列中,将所有 col2 折叠到另一列中,并将所有 col3 折叠到另一列中,对于每个 id。如下。
id x col1 col2 col4
1 0 0 2 3
1 1 1 2 4
1 2 3 3 5
2 0 1 2 4
2 1 1 4 5
2 2 1 7 5
.
.
etc.
此外,我还需要为每个 id 创建一个值为 0,1 和 2 的 x 列。但是,我只能使用下面的代码折叠第一个列范围 (col1)。
library(tidyverse)
longer_data <- dataframe %>%
group_by(id) %>%
pivot_longer(col1_0:col1_2,names_to = "x1",values_to = "col1")
x1 在这里创建一个带有原始列名的列。所以我会创建一个额外的 x 列,它只保留原始列名的最后一个数字。
有没有办法做到这一点?非常感谢!
解决方法
我们不需要任何 BlockBreaker
。通过在 group_by
中指定 pivot_longer
和 names_sep
,可以直接使用 .value
完成。请注意 names_to
和 .value
的顺序。这意味着该列的值应该在 x
之前进入这些前缀中的每一个,并且带有后缀存根的新列进入 'x'
_
-输出
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -id,names_to = c('.value','x'),names_sep = "_")
数据
# A tibble: 6 x 5
# id x col1 col2 col3
# <int> <chr> <int> <int> <int>
#1 1 0 0 2 3
#2 1 1 1 2 4
#3 1 2 3 3 5
#4 2 0 1 2 4
#5 2 1 1 4 5
#6 2 2 2 7 5
,
这是一个使用 reshape
的基本 R 选项,其中 timevar="x"
创建一个名为 x
的列,而 sep="_"
帮助获取原始列名称的最后一个数字。
res <- reshape(
df,direction = "long",idvar = "id",varying = -1,timevar = "x",sep = "_"
)
res <- res[order(res$id),]
- 输出
> res
id x col1 col2 col3
1.0 1 0 0 2 3
1.1 1 1 1 2 4
1.2 1 2 3 3 5
2.0 2 0 1 2 4
2.1 2 1 1 4 5
2.2 2 2 2 7 5
数据
> dput(df)
structure(list(id = 1:2,col1_0 = 0:1,col1_1 = c(1L,1L),col1_2 = 3:2,col2_0 = c(2L,2L),col2_1 = c(2L,4L),col2_2 = c(3L,7L
),col3_0 = 3:4,col3_1 = 4:5,col3_2 = c(5L,5L)),class = "data.frame",row.names = c(NA,-2L))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。