我有以下矢量:
tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2",
"1530 1", "1540 2", "1540 1")
我想在这个向量的每个原子中保留第二个数字,所以它会读取:
c(2,1,2,1,2,1,2,1,2,1)
答案 0 :(得分:36)
可能有更好的方法,但这里有strsplit()
的两种方法:
as.numeric(data.frame(strsplit(tmp3, " "))[2,])
as.numeric(lapply(strsplit(tmp3," "), function(x) x[2]))
如果您可以使用字符...
,则可能不需要as.numeric()答案 1 :(得分:21)
可以在read.table
上使用textConnection
:
X <- read.table(textConnection(tmp3))
然后
> str(X)
'data.frame': 10 obs. of 2 variables:
$ V1: int 1500 1500 1510 1510 1520 1520 1530 1530 1540 1540
$ V2: int 2 1 2 1 2 1 2 1 2 1
所以X$V2
就是您所需要的。
答案 2 :(得分:10)
这取决于您的实际数据与您给出的示例数据的匹配程度。我只想在空间之后获取所有内容,您可以使用gsub
:
gsub(".+\\s+", "", tmp3)
[1] "2" "1" "2" "1" "2" "1" "2" "1" "2" "1"
如果你试图实现一个比“占用空间之后的所有内容”更复杂的规则,那么你需要一个更复杂的常规表达。
答案 3 :(得分:9)
我认为这是最优雅的方式
> res <- sapply(strsplit(tmp3, " "), "[[", 2)
如果你需要它是一个整数
> storage.mode(res) <- "integer"
答案 4 :(得分:5)
substr(x = tmp3, start = 6, stop = 6)
只要你的字符串总是相同的长度,这应该可以解决问题。
(当然,您不必指定参数名称 - substr(tmp3, 6, 6)
也可以正常工作)
答案 5 :(得分:4)
这应该这样做:
library(plyr)
ldply(strsplit(tmp3, split = " "))[[2]]
如果您需要数字矢量,请使用
as.numeric(ldply(strsplit(tmp3, split = " "))[[2]])
答案 6 :(得分:1)
另一个选项是scan()
。要获得第二个值,我们可以使用逻辑子集。
scan(text = tmp3)[c(FALSE, TRUE)]
# [1] 2 1 2 1 2 1 2 1 2 1
答案 7 :(得分:0)
只需添加两个选项-使用stringr::str_split()
或data.table::tstrsplit()
stringr::str_split()
# data posted above by the asker
tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2",
"1530 1", "1540 2", "1540 1")
library(stringr)
as.integer(
str_split(string = tmp3,
pattern = "[[:space:]]",
simplify = TRUE)[, 2]
)
#> [1] 2 1 2 1 2 1 2 1 2 1
simplify = TRUE
告诉str_split
返回一个矩阵,然后我们可以为所需列建立矩阵索引,因此,[, 2]
部分
data.table::tstrsplit()
library(data.table)
as.data.table(tmp3)[, tstrsplit(tmp3, split = "[[:space:]]", type.convert = TRUE)][, V2]
#> [1] 2 1 2 1 2 1 2 1 2 1
type.convert = TRUE
在此处负责转换为整数,但请谨慎使用其他数据集。
索引[, V2]
的部分与上述[, 2]
有类似的原因。在这里,它选择了返回的数据表对象的第二列,其中包含问询者所需的整数值。
sessionInfo()
#> R version 4.0.0 (2020-04-24)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 18362)
#>
#> Matrix products: default
#>
#> locale:
#> [1] LC_COLLATE=English_United States.1252
#> [2] LC_CTYPE=English_United States.1252
#> [3] LC_MONETARY=English_United States.1252
#> [4] LC_NUMERIC=C
#> [5] LC_TIME=English_United States.1252
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> loaded via a namespace (and not attached):
#> [1] compiler_4.0.0 magrittr_1.5 tools_4.0.0 htmltools_0.4.0
#> [5] yaml_2.2.1 Rcpp_1.0.4.6 stringi_1.4.6 rmarkdown_2.1
#> [9] highr_0.8 knitr_1.28 stringr_1.4.0 xfun_0.13
#> [13] digest_0.6.25 rlang_0.4.6 evaluate_0.14
由reprex package(v0.3.0)于2020-05-06创建
答案 8 :(得分:-1)
通过data.table
将1列拆分为2列的简便方法require(data.table)
data_ex = data.table( a = paste( sample(1:3, size=10, replace=TRUE),"-separate", sep="" ))
data_ex[, number:= unlist( strsplit(x=a, split="-") )[[1]], by=a]
data_ex[, word:= unlist( strsplit(x=a, split="-") )[[2]], by=a ]