當我在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)的載體,沒有別的?
謝謝!
當我在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)的載體,沒有別的?
謝謝!
由於您的示例使用strsplit
我想這是你如何獲取你的數據集擺在首位?如果是這樣,使用正則表達式也可以工作,可能會稍微快一點。例如
data <- c("1,2","3,4","5,6")
# Remove everything after ,:
gsub(",.*","",data)
# Select first number:
regmatches(data,regexpr("\\d+",data))
一種方法是使用sapply
:
> sapply(data, "[[", 1)
[1] "1" "3" "5"
或者這樣:-):
foo<- unlist(data)
matrix(foo,nrow=length(data),byrow=TRUE)[,1]
[1] "1" "3" "5"
這將返回一個數值向量函數read.table因爲將應用其測試的列:
> read.table(text=data, sep=",")$V1
[1] 1 3 5
對於載體使用名稱'data'可能是不明智的,因爲它也是ab的名稱ase功能。
另一種解決方案:
unlist(data)[c(TRUE, rep(FALSE, length(data[[1]]) - 1))]
[1] "1" "3" "5"
輝煌和簡單 –
即使是簡單的將是:'不公開(數據)[C(TRUE,FALSE)]' –
@DWin我知道它很容易在這種特殊情況下,但我的命令也適用,如果向量比兩個元素長。 –
您可以使用下面的遞歸函數,它甚至會工作,如果你的列表是超過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))
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)
謝謝,裏卡多。如果數據包含缺失值/ NA值,可以通過任何方式輕鬆擴展此功能?例如如果我的樣本數據如上所述,但數據[[2]] < - NA? – computermacgyver
可能......它具體是否具有NA值,還是超出範圍? –
實際上有一個NA值,對sapply(dat,「[[」,1)「很好),但會導致sapply(dat,」[[「,2)」的下標越界錯誤爲NA值只有一個維度。 – computermacgyver
是的,我有一個CSV,但其中一列實際上是一個由逗號分隔的兩個值列表。我曾想過正則表達式,但最終只是寫了一個循環。然而,這很有用,即使我的真實數據缺少/ NA值,gsub方法也能正常工作。 data <-data <-c(「1,2」,「3,4」,NA,「5,6」) col1 <-gsub(「,。*」,「」,data) col2 <-gsub( 「* 」「,」,數據)' – computermacgyver