2013-06-11 3 views
0

두 개의 csv 파일이 있습니다. 하나는 여러 지점에서 측정을 포함하고 하나는 단일 지점에 대한 설명을 포함합니다. 그것에는 약 100 개의 다른 점과 10000 개의 측정 값이 있지만 단순화를 위해 단지 2 개의 점과 측정 만 있다고 가정합시다.R : 향상된 설명서의 열 이름 변경

data.csv :

point1,point2,date 
25,80,11.06.2013 
26,70,10.06.2013 

description.csv :

point,name,description 
point1,tempA,Temperature in room A 
point2,humidA,Humidity in room A 

가 지금은 dataframes에 CSV 년대의 모두를 읽으십시오. 그런 다음 데이터 프레임의 열 이름을 변경하여 읽기 쉽도록 만듭니다.

options(stringsAsFactors=F) 
DataSource <- read.csv("data.csv") 
DataDescription <- read.csv("description.csv") 
for (name.source in names(DataSource)) 
{ 
    count = 1 
    for (name.target in DataDescription$point) 
    { 
    if (name.source == name.target) 
    { 
     names(DataSource)[names(DataSource)==name.source] <- DataDescription[count,'name'] 
    } 
    count = count + 1 
    } 
} 

내 질문은 다음과 같습니다. 루프없이이를 수행 할 수있는 방법이 있습니까? 내가 한 것처럼 가독성을 위해 이름을 바꿀까요? 그렇지 않다면, 왜?

+1

얼마나 bout'이름 (데이터) <- 설명 $ 이름 [일치 (설명 $ 포인트, 이름 (데이터))] 또는 이렇게 ... – Justin

+0

태그를 편집했습니다. 이것은 괴짜들이 "최적화"라고 부르는 것에 관한 것이 아닙니다. –

+0

편집을위한 Thx DWin. 그냥 괴짜가되어 처음으로 제대로하기 전에 몇 가지 시도가 필요할 수도 있습니다.) – cowhi

답변

2

교체와 트릭은 했나 할당의 양쪽에있는 색인에 맞게 때때로 :

names(DataSource)[match(DataDescription$point, names(DataSource))] <- 
    DataDescription$name[match(DataDescription$point, names(DataSource))] 

#> DataSource 
    tempA humidA  date 
1 25  80 11.06.2013 
2 26  70 10.06.2013 

이전 노력 : 그에 비 구문 이름을 넣어하지 않았다

names(DataSource)[match(DataDescription$point, names(DataSource))] <- 
       gsub(" ", "_", DataDescription$description)[ 
        match(DataDescription$point, names(DataSource))] 

#> DataSource 
    Temperature_in_room_A Humidity_in_room_A  date 
1     25     80 11.06.2013 
2     26     70 10.06.2013 

공지 사항 데이터 프레임. 그렇게하는 것은 불만이었을 것입니다. Anando Mahto의 의견은 잘 고려되어 있습니다. 그것이 데이터 처리의 끝이거나 음모를 세우기위한 노력의 일환 일 경우가 아니면 나는 이것을하고 싶지 않을 것입니다. 이 경우 나는 밑줄을 대체하지 않을 수도있다. lables를 원한다면 space 제약 조건 내에서 텍스트를 접을 때 "\ n"을 삽입해야 할 필요가 있습니다.

+0

OP는'DataDescription $ description'이 아닌'DataDescription $ name' 필드를 사용하여 열의 제목을 지정하려고했습니다. '필드. 하지만 한 가지 수정 외에도 이것은 합리적인 해결책처럼 보입니다. –

+0

코드 창에서 스크롤하여 보았습니다. –

+0

+1 'match'를 더 잘 사용하십시오. –

0

좋아요, 나는 첫 번째 열의 열과 두 번째 열의 열을 같은 순서로 문제를 해결할 것을 명령했습니다. 이제 설명은 데이터 소스와 동일한 포인트 만 있으면됩니다. 여기 내 마지막 코드는 다음과 같습니다 모든 사람에게

# set options to get strings right 
options(stringsAsFactors=F) 

# read in original data 
DataOriginal <- read.csv("data.csv", sep = ";") 
DataDescriptionOriginal <- read.csv("description.csv", sep = ";") 

# sort the data 
DataOrdered <- DataOriginal[,order(names(DataOriginal))] 
DataDescriptionOrdered <- DataDescriptionOriginal[order(DataDescriptionOriginal$points),] 

# copy data into final dataframe and replace names 
Data <- DataOrdered 
names(Data)[match(DataDescriptionOrdered$points, names(Data))] <- gsub(" ", "_", DataDescriptionOrdered$description)[match(DataDescriptionOrdered$points, names(Data))] 

들으 많은 나를 위해 좋은 해결책을 찾기 위해 기여!