2014-02-09 3 views
0

중첩 for 루프의 다른 열 조건에 따라 열의 이름을 바꾸려면 어떻게합니까? 열 이름 A1이 비어 있지 및 Ak (k 어떤 번호가) 열 A2을 통해 비어있는 경우
이 다음 B1_1...B1_k중첩 For 루프 및 열 이름 변경

단순화 된 시료에 열을 B2...Bk의 이름을 변경 : 나는 R에서이 작업을 수행하기 위해 노력하고있어

내 데이터 :

A1 B1 A2 B2 A3 B3 A4 B4 

1 1  2  3  4 

a b  d  c e f 

기본 개념은 Aj가 비어있는 경우, 다음 해당 B 항목이 previ에 "속"이다 ous 열 인덱스 A[j-1] 및 그래서 그것의 이름을 바꿀 필요가있다.

저는 데이터 프레임에서 위치를 사용하려고 할 때 해당 열의 위치가 어디인지 알고 있습니다. 나는 '하지만, 유래에 다소 유사한 게시물을 검토 한

for (k in 1:20){ 
for (j in 1:600){ 
for (i in 0:90) { 

    if (df[j,2*i]!="" && df[j,2*i+2*k]=="") {B[i+1_[i+1]]=df[j,1+2*i+2*k]} 

}}} 

: 아래의 코드는 내가 매우 R 구문을 모르고 작업에 아무것도 가져올 수 없습니다 내가 뭘 생각하고 있지만 초보자이고 그것의 대부분을 이해하지 못했습니다.

+0

당신이 관련 질문을 제공 할 수 있습니다

여기에 더 큰 세트를 위해, 이렇게 유용한 메모리 중복을 피하는 data.table 접근 방식인가? – xlembouras

+0

@xlembouras 상단에 일반적인 질문을 추가했습니다. 미안 내가 뭘 찾고 있는지 내 게시물을 통해 명확하지 않은 경우. – user3235

+0

무슨 목적으로? 열 이름은 ** 해당 열의 내용을 테스트하려는 항목이 아닌 **입니다. 'for '건설을 잊어 버리십시오 - 더 쉬운 방법이 있습니다. 그러나 당신이 성취하고자하는 것을 말해주십시오. –

답변

0

참고 B1_1...B1_k은 한 요소가 더 짧아야합니다. 그래서 같이 B1_1..B1_k-1

df1 <- data.frame(
    A1=c(1, "a"), 
    B1=c(1, "b"), 
    A2=c("", ""), 
    B2=c(2, "d"), 
    A3=c("", ""), 
    B3=c(3, "c"), 
    A4=c("", "e"), 
    B4=c(4, "f")) 
### get columns which are Empty 
Es <- colnames(df1)[sapply(1:ncol(df1), function(x) all((df1[x])==""))] 
### find largest no. following A in these empties 
k1 <- max(as.integer(gsub("A", "", Es))) 
### replace colums B2..Bk with B1_1...Bk-1 
colnames(df1)[grepl("B", colnames(df1))][2:k1] <- paste0("B1_",seq(k1)[-k1]) 
> df1 
    A1 B1 A2 B1_1 A3 B1_2 A4 B4 
1 1 1  2  3  4 
2 a b  d  c e f 

편집?

### get columns with at least one empty cell 
### same as above but replace `all` with `any` 
Es <- colnames(df1)[sapply(1:ncol(df1), function(x) any((df1[x])==""))] 
### find largest no. following A in these empties 
k1 <- max(as.integer(gsub("A", "", Es))) 
### new data frame with columns B2...Bk 
df2 <- df1[grepl("B", colnames(df1))][2:k1] 
### rename 
colnames(df2) <- paste0("B1_",seq(k1)[-k1]) 
> (cbind(df1, df2)) 
    A1 B1 A2 B2 A3 B3 A4 B4 B1_1 B1_2 B1_3 
1 1 1  2  3  4 2 3 4 
2 a b  d  c e f d c f 

새로운 data.frame 다음 cbind ING를 생성하는이 방법은 없습니다 V. 메모리 효율적이지만이 문제가 훨씬 작은 크기 안 나는 그것을 코드를 읽기가 쉽게 생각합니다.

library(data.table) 
dt1 <- as.data.table(df1) 
### get k1 as above 
### get columns B2...Bk 
Bs <- paste0("B", seq(k1)[-1]) 
### add/assign duplicated columns with new column names using := 
> (dt1[, paste0("B1_",seq(k1)[-k1]) := dt1[, Bs, with=FALSE] ]) 
    A1 B1 A2 B2 A3 B3 A4 B4 B1_1 B1_2 B1_3 
1: 1 1  2  3  4 2 3 4 
2: a b  d  c e f d c f 
+0

B1_1에 대한 새 열을 만들고 이전 B_2를 남겨 둘 수 있습니까? 그리고 나서 각 행에서 공을 고려하는 것이 가능할까요? 의미 B4는 B1_3이됩니다. – user3235

+0

완벽한 감사합니다. – user3235