R:列表上的lapply函数(选择/子设置)

时间:2017-04-05 22:40:44

标签: r

我很难“分配”一个列表。

例如,

test <- data.frame(x = c("5353-66", "55-110-4000","6524-533", "62410-165", "653-520-2410"))
test$x <- as.character(test$x)

strsplit(test$x, "-")

strsplit给我一个列表如下:

[[1]]
[1] "5353" "66"  

[[2]]
[1] "55"   "110"  "4000"

[[3]]
[1] "6524" "533" 

[[4]]
[1] "62410" "165"  

[[5]]
[1] "653"  "520"  "2410"

当我运行lapply(strsplit(test$x, "-"), "[[", 1)时,它会给我列表中每个组件的第一个字符串,如下所示:

[[1]]
[1] "5353"

[[2]]
[1] "55"

[[3]]
[1] "6524"

[[4]]
[1] "62410"

[[5]]
[1] "653"

然后......如何分别选择整个[[1]]和[[2]]和[[3]] ...

例如,我想将测试$ y [1]指定为c(“5353”,“66”)并测试$ y [2]作为c(“55”,“110”,“4000”)和等等。

test$y <- lapply(strsplit(test$x, "-"), "[", 1) 

以上一行给了我相同的结果。

2 个答案:

答案 0 :(得分:0)

虽然它可能变得混乱,但它也很容易做到。您走在正确的轨道上,但添加unlist()并使用strsplit() lapply()将获得您想要的内容。

test$y <- lapply(1:length(test$x),function(i) unlist(strsplit(test$x[[i]],"-")))

test$y[[1]]

[1]&#34; 5353&#34; &#34; 66&#34;

答案 1 :(得分:0)

这就是sapply的魔力派上用场 -

test <- data.frame(x = c("5353-66", "55-110-4000","6524-533", "62410-165", "653-520-2410"))
test$x <- as.character(test$x)

sapply(test$x,strsplit,'-')

$`5353-66`
[1] "5353" "66"  

$`55-110-4000`
[1] "55"   "110"  "4000"

$`6524-533`
[1] "6524" "533" 

$`62410-165`
[1] "62410" "165"  

$`653-520-2410`
[1] "653"  "520"  "2410"

您对此处的数据所做的工作取决于您。因为您的数据是不规则的,即它不适合每行需要固定数量单元格的矩形矩阵或数据框,所以您应该将数据保存为列表。事实上数据框是列表,因此许多数据框功能也适用于它们。

如果您必须有数据框,则可以添加NAs以查找丢失的单元格,然后将其转换回宽格式的数据框:

      out_list <- sapply(test$x,strsplit,'-')

      max_length <- max(sapply(out_list,length))


      out_list <- lapply(out_list, function(x) {
        if(length(x)<max_length) {
          x <- c(x,rep(NA,times=max_length-length(x)))
        }
        return(x)
      })

      out_data <- as.data.frame(out_list)


      X5353.66 X55.110.4000 X6524.533 X62410.165 X653.520.2410
      1     5353           55      6524      62410           653
      2       66          110       533        165           520
      3     <NA>         4000      <NA>       <NA>          2410