Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按具有不同ID值的列展开R中的dataframe_R_Subset_Tidyverse - Fatal编程技术网

按具有不同ID值的列展开R中的dataframe

按具有不同ID值的列展开R中的dataframe,r,subset,tidyverse,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) ) 我尝试了以下代码 library(tidyverse) df_new <- bind_cols(df1 %>% select(Value, freq, ID) %>%

我在R中有以下数据帧

df1 <- data.frame(
    "ID" = c("A", "B", "A", "B"),
    "Value" = c(1, 2, 5, 5),
    "freq" = c(1, 3, 5, 3)
)
我尝试了以下代码

library(tidyverse)
df_new <- bind_cols(df1 %>%
                        select(Value, freq, ID) %>%
                        complete(., expand(., 
                                     Value = min(df1$Value):max(df1$Value))),)
库(tidyverse)
df_新%
选择(值、频率、ID)%>%
完成(、展开(.)。,
值=最小值(df1$Value):最大值(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 
值频率ID
11A
2.3 B
3娜娜
4娜娜
5 A
5.3 B

我请求有人帮助我

以下方法对您有效吗

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)
后果 评论
  • 如果我正确地遵循了您的示例,则您的
    ID
    组的值为1到5。如果是这种情况,我的方法将是从原始数据帧生成这两种数据的唯一组合
  • 从原始数据帧中携带的唯一变量是<强>代码> Frq <强> >对于给定的PARP<强> >代码> ID值 < /强>,可能不可用。我将通过
    left\u join
    (正如您喜欢的
    tidyverse
    )加入该变量
    • 在您的示例中,您有值为1,3,5的
      freq
      变量,但在示例中您列出了1,2,5?在我的示例中,我使用了原始的
      freq
      ,然后左键加入它。如果您打算这样做,可以使用普通的
      dplyr
      pipeline进一步修改它

    • 以下方法对您有效吗

      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)
      
      后果 评论
      • 如果我正确地遵循了您的示例,则您的
        ID
        组的值为1到5。如果是这种情况,我的方法将是从原始数据帧生成这两种数据的唯一组合
      • 从原始数据帧中携带的唯一变量是<强>代码> Frq <强> >对于给定的PARP<强> >代码> ID值 < /强>,可能不可用。我将通过
        left\u join
        (正如您喜欢的
        tidyverse
        )加入该变量
        • 在您的示例中,您有值为1,3,5的
          freq
          变量,但在示例中您列出了1,2,5?在我的示例中,我使用了原始的
          freq
          ,然后左键加入它。如果您打算这样做,可以使用普通的
          dplyr
          pipeline进一步修改它

      使用
      数据。表

      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
      

      使用
      数据。表

      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
      

      使用
      tidyr::full_seq
      我们可以找到
      Value
      的完整版本,但是
      嵌套(full_seq(Value,1)
      将返回一个错误:

      错误:
      by
      不能包含RHS中缺少的联接列
      full_seq(值,1)

      因此我们需要添加一个名称,因此
      嵌套(Value=full_seq(Value,1)

      library(tidyr)
      df1%>%完成(ID,嵌套(值=完整顺序(值,1)))
      #一个tibble:10x3
      ID值频率
      1 A 1.1。
      2 A 2.不适用
      3 A 3.不适用
      4 A 4.不适用
      5 A 5.5。
      6b1.NA
      7b2.3。
      8 B 3.不适用
      9 B 4.NA
      10 B 5.3。
      
      使用
      tidyr::full\ seq
      我们可以找到
      值的完整版本,但是
      嵌套(full\ seq(Value,1)
      将返回一个错误:

      错误:
      by
      不能包含RHS中缺少的联接列
      full_seq(值,1)

      因此我们需要添加一个名称,因此
      嵌套(Value=full_seq(Value,1)

      library(tidyr)
      df1%>%完成(ID,嵌套(值=完整顺序(值,1)))
      #一个tibble:10x3
      ID值频率
      1 A 1.1。
      2 A 2.不适用
      3 A 3.不适用
      4 A 4.不适用
      5 A 5.5。
      6b1.NA
      7b2.3。
      8 B 3.不适用
      9 B 4.NA
      10 B 5.3。
      
      但如果您查看第5行,它与所需的输出不同。可能是输入错误。非常好的方法though@patL我认为期望的输出中有一个输入错误,或者计算了
      freq
      ,但原始帖子目前没有提供足够的细节。是的。我也这么认为,但我想指出它以防万一。@patL我在发布我的答案之前检查了它,它可能是一种类型,因为
      freq=c(1,3,5,3)
      @a.Suliman这就是我试图回答这个问题时的想法但如果你看第5行,它与期望的输出不同。可能是打字错误。非常好的方法though@patL我认为期望的输出中有一个输入错误,或者计算了
      freq
      ,但原始帖子目前没有提供足够的细节。是的。我也这么认为,但我想指出它以防万一。@patL I chec在我发布我的答案之前,我把它删掉了,它可能是一种类型,因为
      freq=c(1,3,5,3)
      @a.Suliman这是我试图回答这个问题时的想法。;)CJ指的是什么。交叉连接:只要试着运行
      CJ(ID=c(“a”,“B”),Value=1:5)
      单独运行。就像R基中的expand.grid一样。CJ指的是什么。交叉连接:只需分别运行
      CJ(ID=c(“A”,“B”),Value=1:5)
      。就像R基中的expand.grid一样。
      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.