操纵列表

时间:2018-05-07 00:15:02

标签: r list

我在这里有这个缩短的清单:

> dput(head(included_words, 100))
list(c(1L, 1L), 1:2, c(1L, 3L), c(1L, 4L), c(1L, 6L), c(1L, 7L
), c(1L, 8L), c(1L, 10L), c(1L, 12L), c(1L, 13L), c(1L, 14L), 
    c(1L, 16L), c(1L, 17L), c(1L, 19L), c(1L, 22L), c(1L, 25L
    ), c(1L, 26L), c(1L, 28L), c(1L, 29L), c(1L, 30L), c(1L, 
    31L), c(1L, 32L), c(1L, 34L), c(1L, 35L), c(1L, 37L), c(1L, 
    38L), c(1L, 39L), c(1L, 40L), c(1L, 41L), c(1L, 42L), c(1L, 
    44L), c(1L, 49L), c(1L, 50L), c(1L, 55L), c(1L, 57L), c(1L, 
    59L), c(1L, 60L), c(1L, 63L), c(1L, 65L), c(1L, 67L), c(1L, 
    68L), c(1L, 69L), c(1L, 70L), c(1L, 71L), c(1L, 72L), c(1L, 
    73L), c(1L, 74L), c(1L, 75L), c(1L, 76L), c(1L, 77L), c(1L, 
    78L), c(1L, 79L), c(1L, 80L), c(1L, 81L), c(1L, 82L), c(1L, 
    83L), c(1L, 84L), c(1L, 85L), c(1L, 86L), c(1L, 88L), c(1L, 
    89L), c(1L, 90L), c(1L, 91L), c(1L, 92L), c(1L, 93L), c(1L, 
    94L), c(1L, 95L), c(1L, 96L), c(1L, 97L), c(1L, 98L), c(1L, 
    100L), c(1L, 103L), c(1L, 105L), c(1L, 108L), c(1L, 109L), 
    c(1L, 110L), c(1L, 111L), c(1L, 113L), c(1L, 114L), c(1L, 
    115L), c(1L, 116L), c(1L, 118L), c(1L, 119L), c(1L, 120L), 
    c(1L, 121L), c(1L, 122L), c(1L, 124L), c(1L, 127L), c(1L, 
    128L), c(1L, 129L), c(1L, 130L), c(1L, 131L), c(1L, 132L), 
    c(1L, 133L), c(1L, 134L), c(2L, 1L), c(2L, 2L), c(2L, 4L), 
    c(2L, 5L), c(2L, 7L))

我想做的是将1作为第一个值拉出所有组件----例如,(1 2),(1 3),(1 5)等 然后将所有第二个值(2,3,5)放入第一个组件中,拉出所有组件,其中2为第一个值,并将所有第二个值放入第二个组件等。

这是我到目前为止所拥有的:

lapply(1:length(included_words), function(x) test[[x]][2], test = included_words)

4 个答案:

答案 0 :(得分:0)

我认为最简单的方法是将其转换为数据框:

word_df <- as.data.frame(do.call(rbind, included_words))

完成后,您有多种选择。要按第一个(列)创建列表,我发现plyr包最简单:

library(plyr)
dlply(word_df, .(V1), function(x) x$V2)

请注意,尽管plyr包非常直观且是数据操作的绝佳工具,但它不再被积极开发。它已被包purrrdplyr替换。

使用dplyr套餐,您可以从

开始
library(dplyr)
grouped_df <- word_df %>%
  group_by(V1)

使用此路线,您可能会继续将其他分析/数据处理步骤链接到当前步骤,这些步骤将分别应用于数据框的子集,每个值为V1。< / p>

答案 1 :(得分:0)

可以使用split完成。这是采用整齐的方法。

library(tidyverse)

included_words %>%
  map(~data.frame(x=.[1], y = .[2])) %>%
  bind_rows() %>%
  split(.$x) %>%
  map(~(.$y))

# $`1`
#  [1]   1   2   3   4   6   7   8  10  12  13  14  16  17  19  22  25  26  28  29  30  31
# [22]  32  34  35  37  38  39  40  41  42  44  49  50  55  57  59  60  63  65  67  68  69
# [43]  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  88  89  90  91
# [64]  92  93  94  95  96  97  98 100 103 105 108 109 110 111 113 114 115 116 118 119 120
# [85] 121 122 124 127 128 129 130 131 132 133 134

# $`2`
# [1] 1 2 4 5 7

答案 2 :(得分:0)

如果我们使用base R,那么

with(setNames(do.call(rbind.data.frame, included_words),
    c("V1", "V2")), split(V2, V1))

答案 3 :(得分:0)

基础R解决方案:

mat <- matrix(unlist(included_words),2)
tapply(mat[2,],mat[1,],identity)

# $`1`
# [1]   1   2   3   4   6   7   8  10  12  13  14  16  17  19  22  25  26  28  29  30  31  32  34  35  37  38  39  40  41  42  44  49
# [33]  50  55  57  59  60  63  65  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  88  89  90  91  92
# [65]  93  94  95  96  97  98 100 103 105 108 109 110 111 113 114 115 116 118 119 120 121 122 124 127 128 129 130 131 132 133 134
# 
# $`2`
# [1] 1 2 4 5 7