2013-01-07 3 views
10

mam dataframe tak:dodać wartości kolumny na podstawie innych kolumn w ramce danych, z zastosowaniem, na jeśli

 id  adit  diag1 diag2  
     2  3   4230 2234   
     3  5   3345 4456   
     4  6   4567 4467 

będzie dodam 2 pozostałych kolumn dse1 i dse2 pomocą poniższego pseudokod:

if diag1 contains 4230 then dse1 = 1 else dse1 = 0 

if diag2 contains 4567 then dse2 =1 else dse2 = 0 

użyłem to:

for (i in 1 : nrow(dse)){ 
    for (j in 3: ncol(dse)){ 
    if dse[i,j] %in% ("4320"){dse$dse1 = 1} 
     else{dse$dse1 = 0} 
    if dse[i,j] %in% ("4567"){dse$dse2 = 1} 
     else{dse$dse2 = 0} 
    } 
} 

Ale to nie robić t działa.

+0

Wszystkie poniższe odpowiedzi to poprawna trasa. Jednakże, jeśli używasz 'if/else', to' else musi być w tej samej linii co '' '' z twojego 'if'. – Justin

+0

for (i w 1: nrow (DSE)) { for (j w mieszaninie 3: Ncol (DSE)) { if (DSE [i, j] == 4230) { DSE $ dse1 = 1 } innego { DSE $ dse1 = 0 } if (DSE [i, j]% w% (4567)) {DSE $ dse2 = 1} else {DSE $ dse2 = 0} } } zmienić kody jak wyżej, nie ma błędu, ale wynik nie jest poprawny. Czemu? THnaks – user1582755

+0

Nie jestem pewien, co skomentować. W razie potrzeby możesz edytować pytanie. Ponadto, jeśli któraś z poniższych odpowiedzi rozwiązuje problem, zaznacz go jako odpowiadający, klikając zielony znacznik wyboru na pytanie, abyśmy wszyscy wiedzieli, że został rozwiązany. – Justin

Odpowiedz

18

Nie trzeba używać pętlę, wystarczy użyć ifelse np

dse = within(dse, { 
    dse1 = ifelse(diag1 == 4230, 1, 0) 
    dse2 = ifelse(diag2 == 4567, 1, 0) 
}) 
+4

Przyszedłem na dół, po prostu dodałem przykładowy kod. –

+0

Dzięki. Dse1 może mieć wiele diagnoz, to jest, jeśli dse [i, j]% w% ("2345", "3456", "5678") {dse1 = 1). A kody if mają jakieś woring? jak je poprawić – user1582755

+0

Nie jestem pewien, czego chcesz, proszę dodać więcej informacji do swojego pytania. –

10

Nie używaj symbolu if/else. Idź wektorowy jak w:

dat$dse1 <- as.numeric(dat$diag1 == 4230) 
dat$dse2 <- as.numeric(dat$diag2 == 4567) 
+0

+1 miła odpowiedź, jeśli czujesz, że użycie 'ifelse' jest trochę bardziej przejrzyste. Ponadto możesz mieć inne wartości niż "0" i "1". –

+1

To zdecydowanie najlepsza odpowiedź. 'ifelse (cond, 1, 0)' nigdy nie powinno być używane. –

4

Można użyć transform:

transform(dse, dse1 = as.numeric(diag1 == 4230), 
       dse2 = as.numeric(diag2 == 4567)) 
+0

Dzięki. Dse1 może mieć wiele diagnoz, to jest, jeśli dse [i, j]% w% ("2345", "3456", "5678") {dse1 = 1). – user1582755

4

Jak to:

dse$dse1<-0 
dse$dse2<-0 
dse$dse1[dse$diag1==4230]<-1 
dse$dse2[dse$diag2==4567]<-1 

Przygotuj się na dobry tutorial R (taki jak this) i przeczytaj wszystko o wektorach indeksowych.

+0

Dzięki za wszystkie odpowiedzi.Jeśli zmienimy takie instrukcje, jeśli diag1 LUB diag2 zawiera 4230, to dse1 = 1 else dse1 = 0 , jeśli diag2 lub diag1 zawiera 4567, a następnie dse2 = 1 else dse2 = 0 i jest wiele diagów, w których jest wiele kodów, więc nie ma jest wiele dsesów. Jakie są miłe odpowiedzi – user1582755