【问题标题】:Rearrange and extract values from a data frame to specific columns in R将数据框中的值重新排列并提取到 R 中的特定列
【发布时间】:2020-07-14 08:16:01
【问题描述】:

我有一个这样的数据框 df

> df <- data.frame(type=c("Id","v1","v2","Id","v1","v1","v2","Id","v1","v2","v3"),num=c(1000,200,500,1001,727,50,800,1002,400,365,865))
> df
   type  num
1    Id 1000
2    v1  200
3    v2  500
4    Id 1001
5    v1  727
6    v1   50
7    v2  800
8    Id 1002
9    v1  400
10   v2  365
11   v3  865

我需要创建另一个数据框,其中 Id, v1, v2, v3 作为列名和 df 中的相应值,以便每个 id 下面的变量属于该 id 并且当相同的变量重复时,它必须使用相同的 id 进行映射,如果变量不存在,则必须给出 NA。这是所需的输出。

    Id  v1  v2  v3
1 1000 200 500  NA
2 1001 727  NA  NA
3 1001  50 800  NA
4 1002 400 365 865

我想过一种使用 for 循环的方法。但它似乎复杂且难以构建它。有没有不使用 for 循环的方法。

【问题讨论】:

  • 如果变量在某些情况下不存在,如何确定将当前值放在哪里?例如,对于Id 1001,我们有两个v1(727 和50)和一个v2(800)。我们怎么知道 800 应该接近 v1 值 50 而不是 727?
  • @RicS 在这种情况下,重要的是顺序而不是值。
  • 我知道这是顺序,但为什么v2 中的800 接近v1 中的50 而不是727?我们如何确定?例如,在您接受的解决方案中,v2 中的 800 接近于 v1 中的 727 而不是 50(因此与您在问题中写的输出相反)
  • @RicS 对于v1=727,我们没有v2 和v3(如果您按订单),但我们有v1=50。这就是为什么

标签: r dataframe extract


【解决方案1】:

试着这样做

   library(tidyverse) 
   df %>% 
      mutate(id = ifelse(type == "Id", num, NA)) %>% 
      fill(id) %>% 
      filter(type != "Id") %>% 
      group_by(id, type) %>% 
      mutate(n = row_number()) %>% 
      pivot_wider(c(id, n), names_from = type, values_from = num) %>% 
      select(-n) %>% 
      ungroup()

# A tibble: 4 x 4
     id    v1    v2    v3
  <dbl> <dbl> <dbl> <dbl>
1  1000   200   500    NA
2  1001   727   800    NA
3  1001    50    NA    NA
4  1002   400   365   865

【讨论】:

  • 非常感谢。有用!你能解释一下mutate(n = row_number())吗?
  • row_number() 统计组中 id 和 type 组合的数量。例如,id == 10001 和`type == v1` 2 次。接下来,使用id和n,编译最终表的行
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2020-12-08
相关资源
最近更新 更多