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
3 Réponses :
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))
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
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))]
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