从矢量矢量获取矢量

时间:2012-11-12 13:24:41

标签: r

当我在R中有向量矢量时,如何从每个外部向量中选择包含一个元素的向量?

例如,鉴于此数据:

> data<-c("1,2","3,4","5,6")
> data<-strsplit(data,",")
> data
[[1]]
[1] "1" "2"

[[2]]
[1] "3" "4"

[[3]]
[1] "5" "6"

如何获得包含(1,3,5)的矢量而没有其他内容?

谢谢!

6 个答案:

答案 0 :(得分:8)

一种方法是使用sapply

> sapply( data, "[[", 1 )
[1] "1" "3" "5"

答案 1 :(得分:1)

这将返回一个数字向量,因为read.table会将其测试应用于列:

> read.table(text=data, sep=",")$V1
[1] 1 3 5

向量使用名称“data”可能是不明智的,因为它也是基函数的名称。

答案 2 :(得分:1)

另一种解决方案:

unlist(data)[c(TRUE, rep(FALSE, length(data[[1]]) - 1))]

[1] "1" "3" "5"

答案 3 :(得分:1)

您可以使用以下递归功能,即使您的列表深度超过2级也可以使用

getElemsR <- function(dat, Index, Lev=2)  {
  if ((Lev <- (Lev - 1)) > 1)  {
    inds <- seq(length(dat[[1]]))
    dat <- unlist(lapply(inds, function(i) getElemsR(dat, i, Lev)), recursive=F)
  } 
  sapply(dat, "[[", Index, USE.NAMES=T, simplify=F)
}

# get the 2nd element of every 2nd-Level list
getElemsR(myData, 3)  # Lev=2 by default

# get the 2nd element of every 3rd-Level list
getElemsR(myData, 2, 3)

# if needed as a vector:
unlist(getElemsR(myData, 2, 3))

<小时/> 或者,如果您的列表只有两个级别,那么您可以使用@Romain指出的简单的sapply。 您可以将其包装在函数

getElems <- function (dat, Index)  {
  sapply(dat, "[[", Index)
}

# get the 2nd element of every 2nd-level list
getElems(data1, 2)

<小时/> 样本数据

data1 <- lapply(1:3, paste0, c("A","B"))
data2 <- lapply(4:6, paste0, c("A","B"))
names(data1) <- names(data2) <- c("_sub1", "_sub2", "_sub3")
myData <- list(Lev1A=data1, Lev1B=data2)

答案 4 :(得分:1)

由于您的示例使用strsplit,我假设这是您首先获取数据集的方式?如果是这样,使用正则表达式也可以工作,可能会稍快一点。 e.g。

data <- c("1,2","3,4","5,6")

# Remove everything after ,:
gsub(",.*","",data)

# Select first number:
regmatches(data,regexpr("\\d+",data))

答案 5 :(得分:0)

或者这个:-):

foo<- unlist(data)
matrix(foo,nrow=length(data),byrow=TRUE)[,1] 

[1] "1" "3" "5"