1

Rにベクトルのベクトルがある場合、各外部ベクトルから1つの要素を含むベクトルを選択するにはどうすればよいですか?

たとえば、次のデータがあるとします。

> 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)だけを含むベクトルを取得するにはどうすればよいですか?

ありがとう!

4

6 に答える 6

8

1つの方法は使用することsapplyです:

> sapply( data, "[[", 1 )
[1] "1" "3" "5"
于 2012-11-12T13:29:20.153 に答える
1

read.tableはそのテストを列に適用するため、これは数値ベクトルを返します。

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

これは基本関数の名前でもあるため、ベクトルに「data」という名前を使用することはおそらく賢明ではありません。

于 2012-11-12T15:34:01.317 に答える
1

別の解決策:

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

[1] "1" "3" "5"
于 2012-11-12T16:11:44.823 に答える
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))


または、リストの深さが2レベルしかない場合は、@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)
于 2012-11-12T16:52:41.740 に答える
1

あなたの例では使用しているので、そもそもstrsplitこれがデータセットを取得する方法だと思いますか?その場合、正規表現の使用も機能し、わずかに高速になる可能性があります。例えば

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

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

# Select first number:
regmatches(data,regexpr("\\d+",data))
于 2012-11-12T18:27:41.303 に答える
0

またはこれ:-):

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

[1] "1" "3" "5"
于 2012-11-12T15:06:34.063 に答える