展开数据帧中的R由具有不同的ID值的列

问题描述 投票:1回答:3

我在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 

我请人帮我。

r subset tidyverse
3个回答
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)

Results

   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

Comments

  • 如果我正确下面你的榜样,您的ID组取值从1到5,如果是这样的话,我的做法是生成,从原始数据帧同时读取的独特组合。
  • 被从原始数据帧中携带的唯一的变量是freq可以/可以不为给定的标准杆ID-Value可用。我将通过left_join加入变量(如你似乎喜欢tidyverse) 在你的榜样,你有值1,3,5 freq变量,但在随后的例子中,你列出1,2,5?在我的例子,我把原来的freq离开加入。你可以修改它进一步使用普通dplyr管道,如果这是你打算去做。

3
投票

使用tidyr::full_seq我们可以找到完整版Value,但nesting(full_seq(Value,1)会返回一个错误:

错误:by不能包含联接列full_seq(Value, 1)这是从RHS失踪

所以我们需要添加一个名字,因此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.

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
© www.soinside.com 2019 - 2024. All rights reserved.