微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于折叠从宽格式到长格式的不同列的多个范围的 R 函数? 数据

如何解决用于折叠从宽格式到长格式的不同列的多个范围的 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_longernames_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 举报,一经查实,本站将立刻删除。