2012-11-12 52 views
1

当我在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)的载体,没有别的?

谢谢!

回答

1

由于您的示例使用strsplit我想这是你如何获取你的数据集摆在首位?如果是这样,使用正则表达式也可以工作,可能会稍微快一点。例如

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

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

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

是的,我有一个CSV,但其中一列实际上是一个由逗号分隔的两个值列表。我曾想过正则表达式,但最终只是写了一个循环。然而,这很有用,即使我的真实数据缺少/ NA值,gsub方法也能正常工作。 data <-data <-c(“1,2”,“3,4”,NA,“5,6”) col1 <-gsub(“,。*”,“”,data) col2 <-gsub( “* ”“,”,数据)' – computermacgyver

8

一种方法是使用sapply

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

或者这样:-):

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

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

这将返回一个数值向量函数read.table因为将应用其测试的列:

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

对于载体使用名称'data'可能是不明智的,因为它也是ab的名称ase功能。

1

另一种解决方案:

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

[1] "1" "3" "5" 
+0

辉煌和简单 –

+0

即使是简单的将是:'不公开(数据)[C(TRUE,FALSE)]' –

+0

@DWin我知道它很容易在这种特殊情况下,但我的命令也适用,如果向量比两个元素长。 –

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) 
+0

谢谢,里卡多。如果数据包含缺失值/ NA值,可以通过任何方式轻松扩展此功能?例如如果我的样本数据如上所述,但数据[[2]] < - NA? – computermacgyver

+0

可能......它具体是否具有NA值,还是超出范围? –

+0

实际上有一个NA值,对sapply(dat,“[[”,1)“很好),但会导致sapply(dat,”[[“,2)”的下标越界错误为NA值只有一个维度。 – computermacgyver