简体   繁体   English

R:pivot_wider() 的问题

[英]R: Problems with pivot_wider()

I have the following sample data:我有以下示例数据:

varNames <- c("var1", "var2", "var3", "var4", "var5")
df <- data.frame(VariableID = rep(varNames, 5),
                 Serial = rep(1:5, 5),
                 Response = runif(25, 1, 10))

df

The form I am looking for is this:我要找的表格是这样的:

Serial var1 var2 var3 var4 var5
1      ...  ...  ...  ...  ...
1
1
1
1
2
2
2
2
2
3
3
3
3
3
...

I was trying this:我正在尝试这个:

df %>% pivot_wider(id_cols = Serial, names_from = VariableID, values_from = Response)

The output I get looks like this:我得到的输出如下所示:

# A tibble: 5 x 6
  Serial var1      var2      var3      var4      var5     
   <int> <list>    <list>    <list>    <list>    <list>   
1      1 <dbl [5]> <NULL>    <NULL>    <NULL>    <NULL>   
2      2 <NULL>    <dbl [5]> <NULL>    <NULL>    <NULL>   
3      3 <NULL>    <NULL>    <dbl [5]> <NULL>    <NULL>   
4      4 <NULL>    <NULL>    <NULL>    <dbl [5]> <NULL>   
5      5 <NULL>    <NULL>    <NULL>    <NULL>    <dbl [5]>

What am I doing wrong?我究竟做错了什么? Thanks for help!感谢帮助!

Try this.尝试这个。 The issue is that rows require an id.问题是行需要一个 id。 That can be reached using row_number() .可以使用row_number()达到。 Here the code:这里的代码:

library(tidyverse)
#Code
newdf <- df %>% 
  arrange(Serial) %>%
  group_by(Serial) %>% mutate(id=row_number()) %>% 
  pivot_wider(names_from=VariableID,values_from=Response) %>% select(-id)

Output:输出:

# A tibble: 25 x 6
# Groups:   Serial [5]
   Serial  var1  var2  var3  var4  var5
    <int> <dbl> <dbl> <dbl> <dbl> <dbl>
 1      1  5.52 NA       NA    NA    NA
 2      1  5.50 NA       NA    NA    NA
 3      1  5.13 NA       NA    NA    NA
 4      1  7.88 NA       NA    NA    NA
 5      1  3.49 NA       NA    NA    NA
 6      2 NA     3.68    NA    NA    NA
 7      2 NA     7.54    NA    NA    NA
 8      2 NA     9.63    NA    NA    NA
 9      2 NA     1.09    NA    NA    NA
10      2 NA     3.12    NA    NA    NA
# ... with 15 more rows

You may add unnest() to your function.您可以将unnest()添加到您的函数中。 Therefore the lists will be splittet into rows.因此列表将被拆分成行。

df %>% pivot_wider(id_cols = Serial, 
                   names_from = VariableID, 
                   values_from = Response) %>% 
       unnest()

Output:输出:


# A tibble: 25 x 6
   Serial  var1  var2  var3  var4  var5
    <int> <dbl> <dbl> <dbl> <dbl> <dbl>
 1      1  3.51 NA       NA    NA    NA
 2      1  4.65 NA       NA    NA    NA
 3      1  4.15 NA       NA    NA    NA
 4      1  4.60 NA       NA    NA    NA
 5      1  1.74 NA       NA    NA    NA
 6      2 NA     6.42    NA    NA    NA
 7      2 NA     3.50    NA    NA    NA
 8      2 NA     1.84    NA    NA    NA
 9      2 NA     9.03    NA    NA    NA
10      2 NA     4.78    NA    NA    NA
# ... with 15 more rows

We can create the ids with rowid from data.table我们可以使用data.table rowid创建 ID

library(dplyr)
library(data.table)
library(tidyr)
df %>% 
    arrange(Serial) %>% 
    mutate(id = rowid(Serial)) %>%
    pivot_wider(names_from = VariableID, values_from = Response) %>% 
    select(-id)

-output -输出

# A tibble: 25 x 6
#   Serial  var1  var2  var3  var4  var5
#    <int> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1      1  9.00 NA       NA    NA    NA
# 2      1  7.17 NA       NA    NA    NA
# 3      1  3.47 NA       NA    NA    NA
# 4      1  9.53 NA       NA    NA    NA
# 5      1  2.99 NA       NA    NA    NA
# 6      2 NA     1.83    NA    NA    NA
# 7      2 NA     3.65    NA    NA    NA
# 8      2 NA     5.91    NA    NA    NA
# 9      2 NA     8.91    NA    NA    NA
#10      2 NA     7.75    NA    NA    NA
# … with 15 more rows

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM