首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >长到宽的格式

长到宽的格式
EN

Stack Overflow用户
提问于 2021-01-11 22:37:40
回答 3查看 66关注 0票数 0

我有30,000个唯一ID的实验室记录。我需要将我的数据从长格式转换为与该唯一ID相关的每个ID和TEST_DATE的更宽格式。

一个ID的示例:

我需要将其转换为更广泛的格式,如下所示:

我有一个包含30,000个ID的数据集,我需要为每个ID执行此操作。测试次数最多的ID将决定我们的列数。

我将感谢你可能需要解决这个问题的任何想法!谢谢

EN

回答 3

Stack Overflow用户

发布于 2021-01-11 22:44:45

试试这个:

代码语言:javascript
运行
AI代码解释
复制
library(dplyr)
library(tidyr)
#Code
new <- df %>%
  group_by(ACCT,TEST_DATE) %>%
  summarise(RESULT=round(mean(RESULT,na.rm=T),2)) %>%
  ungroup() %>%
  mutate(across(-ACCT,~as.character(.))) %>%
  pivot_longer(-ACCT) %>%
  group_by(ACCT,name) %>%
  mutate(name=paste0(name,row_number())) %>%
  pivot_wider(names_from = name,values_from=value) %>%
  mutate(across(starts_with('RESULT'),~as.numeric(.)))

输出:

代码语言:javascript
运行
AI代码解释
复制
# A tibble: 2 x 7
# Groups:   ACCT [2]
   ACCT TEST_DATE1 RESULT1 TEST_DATE2 RESULT2 TEST_DATE3 RESULT3
  <int> <chr>        <dbl> <chr>        <dbl> <chr>        <dbl>
1 37733 9/1/2016         3 10/18/2016       2 11/1/2016        1
2 37734 9/1/2016         5 10/18/2016       4 11/1/2016        3

使用的一些数据:

代码语言:javascript
运行
AI代码解释
复制
#Data
df <- structure(list(ACCT = c(37733L, 37733L, 37733L, 37734L, 37734L, 
37734L), TEST_DATE = c("9/1/2016", "10/18/2016", "11/1/2016", 
"9/1/2016", "10/18/2016", "11/1/2016"), RESULT = c(3L, 2L, 1L, 
5L, 4L, 3L)), class = "data.frame", row.names = c(NA, -6L))
票数 2
EN

Stack Overflow用户

发布于 2021-01-12 02:33:21

下面是一个使用dcastdata.table选项,可能会有所帮助(从@Duck借用数据)

代码语言:javascript
运行
AI代码解释
复制
> dcast(setDT(df)[, Q := seq(.N), ACCT], ACCT ~ Q, value.var = c("TEST_DATE", "RESULT"))
    ACCT TEST_DATE_1 TEST_DATE_2 TEST_DATE_3 RESULT_1 RESULT_2 RESULT_3
1: 37733    9/1/2016  10/18/2016   11/1/2016        3        2        1
2: 37734    9/1/2016  10/18/2016   11/1/2016        5        4        3

另一种选择是结合使用meltdcast,生成的格式可能就是您想要的格式

代码语言:javascript
运行
AI代码解释
复制
suppressWarnings({
  type.convert(
    dcast(
      melt(
        setDT(df)[, Q := seq(.N), ACCT],
        id = c("ACCT", "Q"),
        measure = c("TEST_DATE", "RESULT")
      )[order(ACCT, Q)],
      ACCT ~ Q + variable,
      value.var = "value"
    ),
    as.is = TRUE
  )
})

这给了我们

代码语言:javascript
运行
AI代码解释
复制
    ACCT 1_TEST_DATE 1_RESULT 2_TEST_DATE 2_RESULT 3_TEST_DATE 3_RESULT
1: 37733    9/1/2016        3  10/18/2016        2   11/1/2016        1
2: 37734    9/1/2016        5  10/18/2016        4   11/1/2016        3
票数 0
EN

Stack Overflow用户

发布于 2021-01-14 05:30:05

走这条简单的路线

代码语言:javascript
运行
AI代码解释
复制
library(tidyverse)

df %>% group_by(ACCT, TEST_DATE) %>% summarise(RESULT = mean(RESULT)) %>%
  group_by(ACCT) %>% mutate(testno = row_number(), resultno = row_number()) %>%
  pivot_wider(id_cols = ACCT, names_from = c("testno", "resultno"), values_from = c(TEST_DATE, RESULT))

# A tibble: 2 x 9
# Groups:   ACCT [2]
   ACCT TEST_DATE_1_1 TEST_DATE_2_2 TEST_DATE_3_3 TEST_DATE_4_4 RESULT_1_1 RESULT_2_2 RESULT_3_3 RESULT_4_4
  <int> <date>        <date>        <date>        <date>             <dbl>      <dbl>      <dbl>      <dbl>
1 37733 2016-01-07    2016-01-09    2016-01-11    2016-08-10             5        4.5          1          2
2 37734 2016-01-21    2016-08-20    NA            NA                     3        4           NA         NA

使用的数据(dput)

代码语言:javascript
运行
AI代码解释
复制
> dput(df)
structure(list(ACCT = c(37733L, 37733L, 37733L, 37733L, 37734L, 
37734L, 37733L), TEST_DATE = structure(c(16809, 17023, 16811, 
16807, 17033, 16821, 16809), class = "Date"), RESULT = c(3L, 
2L, 1L, 5L, 4L, 3L, 6L)), row.names = c(NA, -7L), class = "data.frame")

df
> df
   ACCT  TEST_DATE RESULT
1 37733 2016-01-09      3
2 37733 2016-08-10      2
3 37733 2016-01-11      1
4 37733 2016-01-07      5
5 37734 2016-08-20      4
6 37734 2016-01-21      3
7 37733 2016-01-09      6
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65675527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文