4
votes

Réorganiser les données du fichier CSV dans R

J'ai le jeu de données suivant qui est lu à partir du fichier CSV:

1   6.5   13
2   12    6
3   9     2.8
4   16.2  26
5   7.5   30

Je voudrais déplacer les données du deuxième groupe (de 13 à 30) comme suit: p>

1   6.5
2   12
3   9
4   16.2
5   7.5
1   13
2   6
3   2.8
4   26
5   30

Notez que ces données seront écrites dans un fichier CSV.

Comment puis-je faire cela? Je ne savais pas comment le faire en R

r

0 commentaires

3 Réponses :


1
votes

Après avoir lu l'ensemble de données ( read.csv depuis base R ou fread depuis data.table ou read_csv à partir de rowr ), créez une colonne de noms de colonnes après regroupement par 'col1' puis étalez le 'col2' avec 'colN'

df1 <-structure(list(col1 = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L
  ), col2 = c(6.5, 12, 9, 16.2, 7.5, 13, 6, 2.8, 26, 30)),
  class = "data.frame", row.names = c(NA, 
 -10L))

données

library(tidvyerse)
df1 %>%
   group_by(col1) %>%
   mutate(colN = str_c("newcol_", row_number())) %>% 
   spread(colN, col2)
# A tibble: 5 x 3
# Groups:   col1 [5]
#   col1 newcol_1 newcol_2
#  <int>    <dbl>    <dbl>
#1     1      6.5     13  
#2     2     12        6  
#3     3      9        2.8
#4     4     16.2     26  
#5     5      7.5     30  


0 commentaires

1
votes

Un "hack". Vous pouvez re name et également supprimer row.names.

df<-read.table(text="1   6.5
2   12
               3   9
               4   16.2
               5   7.5
               1   13
               2   6
               3   2.8
               4   26
               5   30",header=F)

Résultat:

     V2 V2.1
6  13.0  6.5
7   6.0 12.0
8   2.8  9.0
9  26.0 16.2
10 30.0  7.5

Données :

df2<-df[duplicated(df$V1),]
df1<-df[!duplicated(df$V1),]
res<-cbind(df2,df1)
res[,c(2,ncol(res))]


0 commentaires

0
votes

Vous pouvez y parvenir en une seule ligne en utilisant data.table et splitstackshape package-

> dcast(dt, V1~V2 ,value.var="V2")
> data.table::as.data.table(t(apply( df, 1, function(x) c(x[!is.na(x)], x[is.na(x)]))))[,.(V1,`1_6.5`,`1_13`)]

       V1 1_6.5 1_13
    1:  1   6.5   13
    2:  2   6.0   12
    3:  3   2.8    9
    4:  4  16.2   26
    5:  5   7.5   30

OU strong>

Une autre solution complexe-

> library(splitstackshape)
> library(data.table)
> cSplit(setDT(dt)[, list(text=paste(V2, collapse=',')), by = V1],"text")

   V1 text_1 text_2
1:  1    6.5   13.0
2:  2   12.0    6.0
3:  3    9.0    2.8
4:  4   16.2   26.0
5:  5    7.5   30.0


0 commentaires