2016-07-24 4 views
0

에 다음 열에서 값이 일치하는 대체 방법 :나는 데이터 프레임이 R

structure(list(City = structure(c(4L, 2L, 1L, 3L, 3L, 3L), .Label = c("Gold Cost", 
"Melbourne", "Other", "Sydney"), class = "factor"), Town = structure(c(1L, 
1L, 1L, 3L, 4L, 2L), .Label = c("", "Brighton", "Hurstville", 
"Penhurst"), class = "factor")), .Names = c("City", "Town"), class = "data.frame", row.names = c(NA, 
-6L)) 

내가 값을 다른 이름을 지정하고 다음 열에서 값으로 교체 포함 열라는 이름의 도시에서 모든 행을 대체 할을 동일한 행의

내 출력은, 다음과 같이

structure(list(City = structure(c(6L, 4L, 2L, 3L, 5L, 1L), .Label = c("Brighton", 
"Gold Cost", "Hurstville", "Melbourne", "Penhurst", "Sydney"), class = "factor"), 
    Town = structure(c(1L, 1L, 1L, 3L, 4L, 2L), .Label = c("", 
    "Brighton", "Hurstville", "Penhurst"), class = "factor")), .Names = c("City", 
"Town"), class = "data.frame", row.names = c(NA, -6L)) 

내가 전에 어떤 기능을 작성하지 않은하지만 난 그게 다음과 같아야합니다 추측하고있다 :

for(data1 in 1:nrow(data1)) { 
     if(data1$City[i] == 'Other') { 
       data1$city[i] <- data1$Town[i] 
     } else { 
       break 
     } 
} 
  1. 내가 잘못 어디 갔지 ?
  2. 앞으로 이와 같은 문제를 해결하기 위해서는 어떻게 생각해야할까요?
  3. 원하는 결과를 얻으려면 어떻게해야합니까?

답변

1

오류 2 개와 비효율 2 개가 있습니다.

오류 1은 : 당신은 for(data1 대신 for(i을 썼다.

오류 2 : 클래스가 factor이고 City인데 새 레벨을 추가하려고합니다. 대신이 작업을 위해 character으로 변경하십시오. 그렇지 않으면 새 요소 수준이 NA으로 변환됩니다. 이 문제를 해결하는 다른 방법이 있지만 효율이 떨어집니다. 나중에 언제든지 다시 변경할 수 있습니다.

비효율 1 : else 문도 필요하지 않습니다.

비효율 2 :for 루프 (벡터화 된 방식)없이이 작업을 수행 할 수 있습니다. 벡터화 솔루션 이제

 City Town 
[1,] TRUE TRUE 
[2,] TRUE TRUE 
[3,] TRUE TRUE 
[4,] TRUE TRUE 
[5,] TRUE TRUE 
[6,] TRUE TRUE 

data1 == desired_output 
 City  Town 
1  Sydney   
2 Melbourne   
3 Gold Cost   
4 Hurstville Hurstville 
5 Penhurst Penhurst 
6 Brighton Brighton 
data1 <- structure(list(City = structure(c(4L, 2L, 1L, 3L, 3L, 3L), 
.Label = c("Gold Cost", "Melbourne", "Other", "Sydney"), class = "factor"), 
         Town = structure(c(1L, 1L, 1L, 3L, 4L, 2L), 
.Label = c("", "Brighton", "Hurstville", "Penhurst"), class = "factor")), 
        .Names = c("City", "Town"), class = "data.frame", 
    row.names = c(NA, -6L)) 

desired_output <- structure(list(City = structure(c(6L, 4L, 2L, 3L, 5L, 1L), 
.Label = c("Brighton", "Gold Cost", "Hurstville", "Melbourne", "Penhurst", "Sydney"), 
    class = "factor"), Town = structure(c(1L, 1L, 1L, 3L, 4L, 2L), 
.Label = c("", "Brighton", "Hurstville", "Penhurst"), class = "factor")), 
    .Names = c("City", "Town"), class = "data.frame", 
row.names = c(NA, -6L)) 

data1$City <- as.character(data1$City) 
data1$Town <- as.character(data1$Town) 
for(i in 1:nrow(data1)){ 
    if(data1$City[i]=='Other'){ 
    data1$City[i]<- data1$Town[i] 
    } 
} 

data1 

. 루프를 사용하지 않으면 코드가 기하 급수적으로 빠르게 실행되며 적은 코드를 입력해야합니다.

data1$City[data1$City == "Other"] <- data1$Town[data1$City == "Other"] 
+1

아하! 도와 줘서 고맙습니다. @ Hack-R. – Chemjong

관련 문제