행별 R 데이터 프레임 생성
저는 R에 데이터 프레임을 한 줄씩 구성하고 싶습니다.검색을 좀 해봤는데, 제가 생각해낸 것은 빈 목록을 만들고, 목록 인덱스 스칼라를 유지한 다음, 목록에 매번 단일 행 데이터 프레임을 추가하고 목록 인덱스를 하나씩 앞당기는 제안뿐이었습니다.마내침.do.call(rbind,)명부에 올라 있는
이것이 작동하는 동안, 매우 번거롭게 보입니다.같은 목표를 달성할 수 있는 더 쉬운 방법이 없을까요?
분명히 나는 내가 일부를 사용할 수 없는 경우를 언급합니다.apply한 행씩 데이터 프레임 행을 생성해야 합니다.적어도, 할 수 있는 방법이 있습니까?push마지막으로 사용한 인덱스를 명시적으로 추적하는 대신 목록의 끝으로?
추가하거나 사용하여 행별로 확장할 수 있습니다.rbind().
그것은 당신이 해야 한다는 것을 의미하지 않습니다.동적으로 증가하는 구조는 R에서 코딩하는 가장 효율적이지 않은 방법 중 하나입니다.
가능하면 전체 데이터를 frame up front에 할당합니다.
N <- 1e4 # total number of rows to preallocate--possibly an overestimate
DF <- data.frame(num=rep(NA, N), txt=rep("", N), # as many cols as you need
stringsAsFactors=FALSE) # you don't know levels yet
작업 중에 한 번에 행 삽입
DF[i, ] <- list(1.4, "foo")
이는 임의의 data.frame에 적용되며 훨씬 더 효율적일 것입니다.N을 오버샷하면 항상 마지막에 빈 행을 축소할 수 있습니다.
할수있다니에 행을 할 수 .NULL:
df<-NULL;
while(...){
#Some code that generates new row
rbind(df,row)->df
}
예를 들어.
df<-NULL
for(e in 1:10) rbind(df,data.frame(x=e,square=e^2,even=factor(e%%2==0)))->df
print(df)
이것은 사용 방법에 대한 어리석은 예입니다.do.call(rbind,)로의 으로.Map() 은]lapply()]
> DF <- do.call(rbind,Map(function(x) data.frame(a=x,b=x+1),x=1:3))
> DF
x y
1 1 2
2 2 3
3 3 4
> class(DF)
[1] "data.frame"
저는 이 구조물을 꽤 자주 사용합니다.
제가 Rcpp를 그렇게 좋아하는 이유는 Rcore의 생각을 항상 이해하지 못하기 때문이고, Rcpp의 경우에는 그렇지 않은 경우가 더 많습니다.
철학적으로 말하자면, 여러분은 모든 가치가 다른 모든 가치와 독립적으로 나타나도록 하는 기능적 패러다임에 대해 죄악의 상태에 있습니다. 하나의 가치를 변경하는 것이 다른 가치에 가시적인 변화를 초래해서는 안 됩니다. 즉, C에서 표현을 공유하는 포인터로 얻는 방식입니다.
이 문제는 기능 프로그래밍이 작은 우주선에게 길을 비켜달라고 신호를 보내고, 작은 우주선이 "나는 등대입니다."라고 대답할 때 발생합니다.처리하려는 큰 물체에 대해 일련의 작은 변경을 길게 하면 등대 영역에 사각형이 됩니다.
C++ STL은push_back()는 삶의 한 방식입니다.이것은 기능적이려고 노력하지 않지만, 일반적인 프로그래밍 관용구를 효율적으로 수용하려고 노력합니다.
뒤에서 약간의 영리함으로, 여러분은 때때로 각각의 세계에 한 발을 두는 것을 준비할 수 있습니다.스냅샷 기반 파일 시스템이 좋은 예입니다(유니온 마운트와 같은 개념에서 발전했으며 양쪽 모두를 지원합니다).
R Core가 이를 수행하기를 원한다면 기본 벡터 스토리지가 유니언 마운트처럼 작동할 수 있습니다. " 스지대하참의첨조자대다있수니습유효벡할해터에가나한에토리▁subscript"에 유효할 수 있습니다.1:N에 대해 , 동일한 스토리지에 대한 다른 참조는 구독자에 대해 유효합니다.1:(N+1)가 있을 수 예약을 합니다.push_back()기존 참조가 유효하다고 간주하는 범위를 벗어나 추가할 때 기능 개념을 위반하지 않습니다.
결국 행을 점진적으로 추가하면 예약된 스토리지가 부족해집니다.스토리지를 몇 배로 늘린 상태에서 모든 복사본을 새로 만들어야 합니다.제가 사용한 STL 구현은 할당을 확장할 때 스토리지를 2배 증가시키는 경향이 있습니다.저는 R Internals에서 스토리지가 20% 증가하는 메모리 구조가 있다는 것을 읽은 것으로 생각했습니다.어느 쪽이든 증가 연산은 추가된 총 요소 수에 상대적인 로그 빈도로 발생합니다.상각 기준으로, 이것은 일반적으로 허용됩니다.
뒤에서 속임수를 쓸수록, 저는 더 나쁜 것을 보았습니다.당신이 있을 때마다push_back()데이터 프레임에 대한 새 행, 최상위 인덱스 구조를 복사해야 합니다.새 행은 이전 기능 값에 영향을 주지 않고 공유 표현에 추가할 수 있습니다. 만들지도 않을합니다. 저는 수거기를 제안하지 않기 때문입니다. 왜냐하면 저는 제안하지 않기 때문입니다.push_front()모든 참조는 할당된 벡터 저장소 앞에 대한 접두사 참조입니다.
저는 매트릭스 없이 원시 방식으로 데이터 프레임을 만드는 방법을 찾았습니다.
자동 열 이름 사용
df<-data.frame(
t(data.frame(c(1,"a",100),c(2,"b",200),c(3,"c",300)))
,row.names = NULL,stringsAsFactors = FALSE
)
열 이름 포함
df<-setNames(
data.frame(
t(data.frame(c(1,"a",100),c(2,"b",200),c(3,"c",300)))
,row.names = NULL,stringsAsFactors = FALSE
),
c("col1","col2","col3")
)
Dirk Eddelbuettel의 답변이 가장 좋습니다. 여기서는 데이터 프레임 치수나 데이터 유형을 미리 지정하지 않아도 됩니다. 이는 데이터 유형이 여러 개이고 열이 많은 경우에 유용합니다.
row1<-list("a",1,FALSE) #use 'list', not 'c' or 'cbind'!
row2<-list("b",2,TRUE)
df<-data.frame(row1,stringsAsFactors = F) #first row
df<-rbind(df,row2) #now this works as you'd expect.
행이 될 벡터가 있는 경우 다음을 사용하여 연결합니다.c()행렬을 한 행씩 행렬로 전달하고 행렬을 데이터 프레임으로 변환합니다.
예: 행
dummydata1=c(2002,10,1,12.00,101,426340.0,4411238.0,3598.0,0.92,57.77,4.80,238.29,-9.9)
dummydata2=c(2002,10,2,12.00,101,426340.0,4411238.0,3598.0,-3.02,78.77,-9999.00,-99.0,-9.9)
dummydata3=c(2002,10,8,12.00,101,426340.0,4411238.0,3598.0,-5.02,88.77,-9999.00,-99.0,-9.9)
다음과 같이 데이터 프레임으로 변환할 수 있습니다.
dummyset=c(dummydata1,dummydata2,dummydata3)
col.len=length(dummydata1)
dummytable=data.frame(matrix(data=dummyset,ncol=col.len,byrow=TRUE))
분명히, 두 가지 주요 제한 사항이 있습니다. (1) 단일 모드 데이터에서만 작동하고, (2) 이 작업을 수행하려면 최종 # 열을 알아야 합니다(즉, 최대 행 길이가 알 수 없는 래깅 배열을 사용하지 않는 것으로 가정합니다)
이 해결책은 간단해 보이지만, R에서 유형 변환에 대한 제 경험으로 볼 때, 저는 그것이 향후 새로운 도전을 야기할 것이라고 확신합니다.누가 이것에 대해 의견을 말해줄 수 있습니까?
새 행의 형식에 따라 다음을 사용할 수 있습니다.tibble::add_row새 행이 단순하고 "value-interval"로 지정할 수 있는 경우.아니면 당신은 사용할 수 있습니다.dplyr::bind_rows"do.call(do.call)의 공통 패턴의 효율적인 구현".
언급URL : https://stackoverflow.com/questions/3642535/creating-an-r-dataframe-row-by-row
'codememo' 카테고리의 다른 글
| 이미 평가 중인 약속: 재귀적 기본 인수 참조 또는 이전 문제? (0) | 2023.07.13 |
|---|---|
| 내장된 ASP.NET Core DI Container보다 타사 DI Container를 사용하는 이유는 무엇입니까? (0) | 2023.07.13 |
| Vuex에서 데이터를 업데이트하는 중 감시자에서 무한 루프 가져오기 (0) | 2023.07.13 |
| 사전에 전달된 모델 항목의 유형은 'mvc'입니다.Models.ModelA'이지만 이 사전에는 'mvc' 유형의 모델 항목이 필요합니다.모델.모델 B' (0) | 2023.07.13 |
| Git: 디렉터리의 모든 파일을 다른 분기에서 복사합니다. (0) | 2023.07.13 |