2014-06-23 6 views
1

J'ai une trame de donnéesComment basculer entre deux niveaux dans un data.frame dans R?

>id=c(1,2,1,1,2);type=c("B","S","S","B","B") 
>temp=data.frame(id, type) 
    id type 
1 1 B 
2 2 S 
3 1 S 
4 1 B 
5 2 B 

Ainsi, le type a deux niveaux: B et S. Pour chaque ligne, si id == 2, je voudrais passer le niveau et laisser son id = 1, et obtenir quelque chose comme ceci:

id type 
1 1 B 
2 1 B 
3 1 S 
4 1 B 
5 1 S 

J'ai essayé de code:

>for (i in 1:nrow(temp)) { 
    if (temp[i,1]==2) 
    {if (temp[i,2]=="B") temp[i,2]=="S" 
     else temp[i,2]=="B";temp[i,1]=1;} } 

Mais ça n'a pas marché. Il a retourné ceci:

id type 
1 1 B 
2 1 S 
3 1 S 
4 1 B 
5 1 B 

temp [i, 1] a changé mais temp [i, 2] reste le même. Comment puis-je le réparer? Et y a-t-il une manière plus simple de faire ceci parce que mon code semble très maladroit? Merci d'avance. -Natalia

Répondre

1

Je pense que cela fonctionnera. Bien que, peut-être il y a un moyen plus simple.

id=c(1,2,1,1,2); type=c("B","S","S","B","B") 
temp=data.frame(id, type, stringsAsFactors = FALSE) 

temp$type2 <- ifelse(temp$type == 'B', 'S', 'B') 
temp 
# id type type2 
#1 1 B  S 
#2 2 S  B 
#3 1 S  B 
#4 1 B  S 
#5 2 B  S 

temp2 <- temp[,1:2] 
temp2$type <- ifelse(temp$id == 2, temp$type2, temp$type) 
temp2$id <- 1 
temp2 

# id type 
#1 1 B 
#2 1 B 
#3 1 S 
#4 1 B 
#5 1 S 
+0

Merci. Et dois-je utiliser "stringsAsFactors = FALSE"? Parce que mon cadre de données est en fait lu à partir d'un fichier csv. temp = data.frame (id, type) est juste un exemple ... – Natalia

+0

Il fonctionne dans ce cas, mais ne semble pas dans mon réel data.frame..Voici le problème: '> temp $ type2 [1] "S" "S" "B" "B" "B" "B" '' temp $ type [1] BBSSSS Niveaux: BS' Mais j'ai déjà utilisé ce '> temp = temp2 = as.data. frame (test2, stringsAsFactors = FAUX) '. – Natalia

+0

@Natalia Je ne suis pas sûr de comprendre. Pensez à modifier votre message d'origine pour inclure un exemple plus complexe en bas dans lequel mon code ne fonctionne pas. Publiez également le résultat souhaité avec cet exemple plus complexe et je verrai si je peux éditer mon code pour retourner la bonne réponse pour les deux exemples de données. Si le problème est que j'utilise un nom de variable ('temp2') que vous utilisez déjà pour autre chose, changez simplement mon nom de variable' temp2' en quelque chose d'unique, en quelque chose que vous n'utilisez pas déjà pour autre chose. –

Questions connexes