通过具有不同ID值的列扩展R中的数据框

时间:2019-02-06 07:49:18

标签: r subset tidyverse

我在R中有以下数据框

df1 <- data.frame(
    "ID" = c("A", "B", "A", "B"),
    "Value" = c(1, 2, 5, 5),
    "freq" = c(1, 3, 5, 3)
)

我希望获得以下数据框

     Value      freq  ID
      1           1    A
      2          NA    A 
      3          NA    A
      4          NA    A
      5          1     A
      1          NA    B
      2          2     B 
      3          NA    B
      4          NA    B
      5          5     B    

我尝试了以下代码

library(tidyverse)
df_new <- bind_cols(df1 %>%
                        select(Value, freq, ID) %>%
                        complete(., expand(., 
                                     Value = min(df1$Value):max(df1$Value))),)

我得到以下输出

   Value  freq ID   
 <dbl> <dbl> <fct>
 1     1     A    
 2     3     B    
 3     NA    NA   
 4     NA    NA   
 5     5     A    
 5     3     B 

我请求某人帮助我。

3 个答案:

答案 0 :(得分:3)

使用tidyr::full_seq可以找到Value的完整版本,但是nesting(full_seq(Value,1)将返回错误:

  

错误:by不能包含RHS缺少的连接列full_seq(Value, 1)

所以我们需要添加一个名称,因此nesting(Value=full_seq(Value,1)

library(tidyr)
df1 %>% complete(ID, nesting(Value=full_seq(Value,1)))

# A tibble: 10 x 3
  ID    Value  freq
  <fct> <dbl> <dbl>
  1 A        1.    1.
  2 A        2.   NA 
  3 A        3.   NA 
  4 A        4.   NA 
  5 A        5.    5.
  6 B        1.   NA 
  7 B        2.    3.
  8 B        3.   NA 
  9 B        4.   NA 
 10 B        5.    3.

答案 1 :(得分:2)

使用data.table

library(data.table)
setDT(df1) 
setkey(df1, ID, Value)

df1[CJ(ID = c("A", "B"), Value = 1:5)]

    ID Value freq
 1:  A     1    1
 2:  A     2   NA
 3:  A     3   NA
 4:  A     4   NA
 5:  A     5    5
 6:  B     1   NA
 7:  B     2    3
 8:  B     3   NA
 9:  B     4   NA
10:  B     5    3

答案 2 :(得分:1)

以下方法对您有用吗?

with(data = df1,
     expr = {
         data.frame(Value = rep(wrapr::seqi(min(Value), max(Value)), length(unique(ID))),
                    ID = unique(ID))
     }) %>%
    left_join(y = df1,
              by = c("ID" = "ID", "Value" = "Value")) %>%
    arrange(ID, Value)

结果

   Value ID freq
1      1  A    1
2      2  A   NA
3      3  A   NA
4      4  A   NA
5      5  A    5
6      1  B   NA
7      2  B    3
8      3  B   NA
9      4  B   NA
10     5  B    3

评论

  • 如果我正确地遵循了您的示例,则您的 ID 组的取值范围是1到5。如果是这种情况,我的方法是生成读取的唯一组合都来自原始数据帧。
  • 从原始数据帧携带的唯一变量是 freq ,该变量可能/可能不适用于给定的标准 ID-Value 。我将通过left_join (您似乎喜欢tidyverse)加入该变量
    • 在您的示例中,您有 freq 变量,其值分别为1,3,5,但是在示例中,您列出了1,2,5?在我的示例中,我选择了原始的 freq 并退出了。如果您打算这样做,则可以使用普通的dplyr管道对其进行进一步的修改。
相关问题