R의 빈 벡터에 값을 추가하시겠습니까?
저는 R을 배우려고 하는데 어떻게 목록에 추가해야 할지 모르겠어요.
만약 이것이 파이썬이었다면 나는….
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
R에서 이것을 어떻게 합니까?
#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector
for 루프의 객체에 추가하면 반복할 때마다 전체 객체가 복사되므로 많은 사람들이 "R은 느리다" 또는 "R 루프는 피해야 한다"고 말합니다.
BrodieG가 코멘트에서 언급했듯이, 원하는 길이의 벡터를 미리 할당한 다음 루프에서 요소 값을 설정하는 것이 훨씬 좋습니다.
다음은 벡터에 값을 추가하는 몇 가지 방법입니다.그들 모두는 낙담했습니다.
루프에서 벡터에 추가
# one way
for (i in 1:length(values))
vector[i] <- values[i]
# another way
for (i in 1:length(values))
vector <- c(vector, values[i])
# yet another way?!?
for (v in values)
vector <- c(vector, v)
# ... more ways
help("append")
질문에 대답하고 이 질문을 작성하는 데 걸리는 시간을 절약할 수 있었을 것입니다(그러나 나쁜 습관을 갖게 했을 것입니다).;-)
참고:vector <- c()
빈 벡터가 아닙니다; 그것은NULL
빈 문자 벡터를 사용하려면 다음을 사용합니다.vector <- character()
.
루프하기 전에 벡터 사전 할당
for 루프를 사용해야 하는 경우 루프 전에 전체 벡터를 미리 할당해야 합니다.이는 더 큰 벡터에 추가하는 것보다 훨씬 빠릅니다.
set.seed(21)
values <- sample(letters, 1e4, TRUE)
vector <- character(0)
# slow
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
# user system elapsed
# 0.340 0.000 0.343
vector <- character(length(values))
# fast(er)
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
# user system elapsed
# 0.024 0.000 0.023
FWIW: 파이썬의 append()와 유사함:
b <- 1
b <- c(b, 2)
몇 가지 옵션이 있습니다.
c(vector, values)
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
첫 번째는 표준 접근법입니다.두 번째는 끝이 아닌 다른 곳에 추가할 수 있는 옵션을 제공합니다.마지막 것은 약간 일그러졌지만 수정할 수 있는 장점이 있습니다.vector
(정말로, 당신은 그렇게 쉽게 할 수 있습니다.vector <- c(vector, values)
.
R에서는 벡터를 순환할 필요가 없습니다.그냥 전체적으로 수술하시면 됩니다.
또한, 이것은 상당히 기본적인 것이기 때문에, 당신은 몇 가지 참고 자료를 검토해야 합니다.
OP 피드백을 기반으로 한 추가 옵션:
for(i in values) vector <- c(vector, i)
@BrodieG가 지적했듯이 for 루프에서 벡터에 값을 추가하는 것은 실제로 R의 철학이 아닙니다. R은 벡터 전체에서 작동함으로써 더 잘 작동합니다.코드를 다음과 같이 다시 쓸 수 없는지 확인합니다.
ouput <- sapply(values, function(v) return(2*v))
출력은 반환 값의 벡터가 됩니다.사용할 수도 있습니다.lapply
값이 벡터 대신 리스트인 경우.
때때로 우리는 루프를 사용해야 합니다. 예를 들어, 결과를 얻기 위해 얼마나 많은 반복이 필요한지 모를 때 말입니다.루프를 예로 들어 보겠습니다.다음은 절대 피해야 할 방법입니다.
a=numeric(0)
b=1
system.time(
{
while(b<=1e5){
b=b+1
a<-c(a,pi)
}
}
)
# user system elapsed
# 13.2 0.0 13.2
a=numeric(0)
b=1
system.time(
{
while(b<=1e5){
b=b+1
a<-append(a,pi)
}
}
)
# user system elapsed
# 11.06 5.72 16.84
R은 벡터가 나타날 때마다 벡터를 복사하기 때문에 매우 비효율적입니다.
가장 효율적으로 추가할 수 있는 방법은 색인을 사용하는 것입니다.참고로 이번에는 1e7번 반복했지만 여전히 훨씬 빠릅니다.c
.
a=numeric(0)
system.time(
{
while(length(a)<1e7){
a[length(a)+1]=pi
}
}
)
# user system elapsed
# 5.71 0.39 6.12
이것은 허용됩니다.그리고 우리는 그것을 교체함으로써 조금 더 빨리 만들 수 있습니다.[
와 함께[[
.
a=numeric(0)
system.time(
{
while(length(a)<1e7){
a[[length(a)+1]]=pi
}
}
)
# user system elapsed
# 5.29 0.38 5.69
아마도 당신은 이미 그것을 알아차렸을 것입니다.length
시간이 많이 걸릴 수 있습니다.우리가 교체하면,length
카운터 포함:
a=numeric(0)
b=1
system.time(
{
while(b<=1e7){
a[[b]]=pi
b=b+1
}
}
)
# user system elapsed
# 3.35 0.41 3.76
다른 사용자가 언급했듯이 벡터를 미리 할당하는 것이 매우 유용합니다.그러나 결과를 얻기 위해 루프가 몇 개나 필요한지 모르는 경우에는 속도와 메모리 사용량 간의 균형을 유지해야 합니다.
a=rep(NaN,2*1e7)
b=1
system.time(
{
while(b<=1e7){
a[[b]]=pi
b=b+1
}
a=a[!is.na(a)]
}
)
# user system elapsed
# 1.57 0.06 1.63
중간 방법은 결과 블럭을 점진적으로 추가하는 것입니다.
a=numeric(0)
b=0
step_count=0
step=1e6
system.time(
{
repeat{
a_step=rep(NaN,step)
for(i in seq_len(step)){
b=b+1
a_step[[i]]=pi
if(b>=1e7){
a_step=a_step[1:i]
break
}
}
a[(step_count*step+1):b]=a_step
if(b>=1e7) break
step_count=step_count+1
}
}
)
#user system elapsed
#1.71 0.17 1.89
R에서는 다음과 같은 방법으로 시도할 수 있습니다.
X = NULL
X
# NULL
values = letters[1:10]
values
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
X = append(X,values)
X
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
X = append(X,letters[23:26])
X
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "w" "x" "y" "z"
> vec <- c(letters[1:3]) # vec <- c("a","b","c") ; or just empty vector: vec <- c()
> values<- c(1,2,3)
> for (i in 1:length(values)){
print(paste("length of vec", length(vec)));
vec[length(vec)+1] <- values[i] #Appends value at the end of vector
}
[1] "length of vec 3"
[1] "length of vec 4"
[1] "length of vec 5"
> vec
[1] "a" "b" "c" "1" "2" "3"
파이썬 코드에서 사용하는 것을 파이썬의 목록이라고 하며, R 벡터와 완전히 다릅니다. 만약 제가 당신이 원하는 것을 얻는다면:
# you can do like this if you'll put them manually
v <- c("a", "b", "c")
# if your values are in a list
v <- as.vector(your_list)
# if you just need to append
v <- append(v, value, after=length(v))
R에서 다음을 수행하여 "목록"을 만듭니다.
v <- numeric()
벡터 자터벡또파의이썬는숫)▁int)
v <- character()
벡터 또는 문자 벡터)
단일 값을 추가하려면 다음 작업을 수행해야 합니다.
v[1] <- 10
벡터, a 값 10 ( "1" 에 "v" 당 값 해 10)
v[2] <- 11
"v 벡터 "에서 a 값 11을 나타냄 (에 "v" 대 한 벡 터 "2" a 값 11)
따라서 for 루프에 여러 값을 추가하려면 다음을 수행합니다.
v <- numeric()
for (value in 1:10) {
v[value] <- value
}
v
[1] 1 2 3 4 5 6 7 8 9 10
언급URL : https://stackoverflow.com/questions/22235809/append-value-to-empty-vector-in-r
'programing' 카테고리의 다른 글
어떻게 하면 ASP에서 더 많은 권한을 가질 수 있습니까?NET? (0) | 2023.05.06 |
---|---|
postgres 데이터베이스에서 단일 테이블의 백업을 만드는 방법은 무엇입니까? (0) | 2023.05.06 |
스타일을 변경하지 않고 셀 내용을 지울 수 있습니까? (0) | 2023.05.06 |
SQL Server를 사용하여 날짜 비교 (0) | 2023.05.06 |
Windows AppFabric이란 무엇입니까? (0) | 2023.05.06 |