我很难“分配”一个列表。
例如,
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)
以上一行给了我相同的结果。
答案 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