简体   繁体   English

R dataframe:将多行上的值转换为列表

[英]R dataframe: Transfrom values on multiple rows into list

I want to transform this:我想改变这个:

library(tibble)
(
  tribble(
    ~id, ~value,
## -----|--------| 
     1,   "qwer",
     1,   "asdf",
     2,   "uiop",
     3,   "zxcv",
     3,   "qwer",
     3,   "uiop" )
) -> input

into this:进入这个:

(
  tribble(
    ~id,          ~values,
## -----|------------------------------| 
     1,   list("qwer", "asdf"),
     2,   list("uiop"),
     3,   list("zxcv", "qwer", "uiop"))
) -> output

Please note that the number of disinct values is not known...请注意,不明确值的数量是未知的......

Edit in view of comment below根据下面的评论进行编辑

If you want to store each value as list containing every value as distinct item, please do it like this如果您想将每个值存储为包含每个值作为不同项目的列表,请这样做

input %>% group_by(dummy = row_number()) %>%
  mutate(value = list(value)) %>%
  ungroup() %>% group_by(id) %>%
  summarise(value = list(value))

# A tibble: 3 x 2
     id value     
  <dbl> <list>    
1     1 <list [2]>
2     2 <list [1]>
3     3 <list [3]>

#check its structure
output <- input %>% group_by(dummy = row_number()) %>%
  mutate(value = list(value)) %>%
  ungroup() %>% group_by(id) %>%
  summarise(value = list(value))

output$value[[1]]
[[1]]
[1] "qwer"

[[2]]
[1] "asdf"

#OR
output$value
[[1]]
[[1]][[1]]
[1] "qwer"

[[1]][[2]]
[1] "asdf"


[[2]]
[[2]][[1]]
[1] "uiop"


[[3]]
[[3]][[1]]
[1] "zxcv"

[[3]][[2]]
[1] "qwer"

[[3]][[3]]
[1] "uiop"

在此处输入图像描述

old answer this will store item in a vector first and then in a list (single item)旧答案这将首先将项目存储在向量中,然后存储在列表中(单个项目)

Use this用这个

input %>% group_by(id) %>% summarise(value = list(value))

# A tibble: 3 x 2
     id value    
  <dbl> <list>   
1     1 <chr [2]>
2     2 <chr [1]>
3     3 <chr [3]>

#check its items

output <- input %>% group_by(id) %>% summarise(value = list(value))

output$value[[1]]
[1] "qwer" "asdf"

#OR
output$value
[[1]]
[1] "qwer" "asdf"

[[2]]
[1] "uiop"

[[3]]
[1] "zxcv" "qwer" "uiop"

sample data output is as under (which matches first syntax) still second one is suggested unless any specific reason to do so.示例数据 output 如下所示(与第一个语法匹配),除非有任何具体原因,否则建议使用第二个。

output$value
(
  tribble(
    ~id,          ~values,
    ## -----|------------------------------| 
    1,   list("qwer", "asdf"),
    2,   list("uiop"),
    3,   list("zxcv", "qwer", "uiop"))
) -> output

output$values

[[1]]
[[1]][[1]]
[1] "qwer"

[[1]][[2]]
[1] "asdf"


[[2]]
[[2]][[1]]
[1] "uiop"


[[3]]
[[3]][[1]]
[1] "zxcv"

[[3]][[2]]
[1] "qwer"

[[3]][[3]]
[1] "uiop"

在此处输入图像描述

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

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