2012-11-12 3 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가 있지만 열 중 하나가 실제로 쉼표로 구분 된 두 개의 값 목록입니다. 내가 정규식에 대해 생각했지만, 그냥 루프를 작성 결국. 그러나 이것은 유용합니다. gsub 접근법은 실제 데이터에/NA 값이없는 경우에도 작동합니다. 'data <-data <- c ("1,2", "3,4", NA, "5,6") col1 <-gsub (",. *", ""데이터) col2 <-gsub (". *,", "", data)' – computermacgyver

8

한 가지 방법은 사용하는 것입니다 sapply :

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

또는이 :-) : read.table이 컬럼에 자사의 테스트를 적용하기 때문에

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

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

이것은 숫자 벡터를 반환합니다

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

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

당신은 당신의 목록이있는 경우 목록을

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)) 
깊은 2 개 이상의-수준,


또는 경우에도 작동합니다 다음과 같은 재귀 함수를 사용할 수 있습니다 깊이가 2 단계 인 경우, @ 원주민이 지적한 것처럼 단순한 사pply를 사용할 수 있습니다. 당신은 예부터 함수에

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

감사합니다, Ricardo. 누락 된/NA 값이 데이터에 포함되어 있다면 쉽게 확장 할 수있는 방법은 없습니까? 예 : 샘플 데이터가 위와 같았 으면 데이터 [[2]] <- NA입니까? – computermacgyver

+0

아마도 ... NA의 값이 구체적으로 있습니까? 아니면 범위를 벗어 났습니까? –

+0

실제로는 'sapply (dat, "[[", 1)']에 대해 잘 작동하지만 NA 대신'sapply (dat, [[ ", 2)}에 대한 첨자가 범위를 벗어납니다. 값에는 하나의 차원 만 있습니다. – computermacgyver