[R] to modify a dataframe

Rui Barradas ruipbarradas at sapo.pt
Wed Jan 1 18:32:51 CET 2014


Hello,

Here's one way.



lst1 <- lapply(split(df1, gsub("[0-9]", "", df1$Nom)), function(x){
		x[, -1] <- lapply(x[, -1], function(y){
			z <- if(any(y == 1)) 1 else 0
			rep(z, length(y))
		})
		x
	})
df3 <- do.call(rbind, lst1)
rownames(df3) <- NULL

identical(df2, df3)  # TRUE


Hope this helps,

Rui Barradas

Em 01-01-2014 16:55, Arnaud Michel escreveu:
> Dear All,
>
>  From the dataframe df1
>
> df1 <-
> structure(list(Nom = structure(1:9, .Label = c("A1", "A2", "A3",
> "B1", "B2", "C1", "C2", "C3", "C4"), class = "factor"), Pays1 = c(1,
> 1, 0, 0, 1, 0, 0, 0, 0), Pays2 = c(0, 0, 0, 1, 1, 0, 1, 0, 1),
>      Pays3 = c(0, 0, 0, 0, 1, 0, 0, 0, 0), Pays4 = c(1, 0, 0,
>      0, 0, 0, 1, 0, 1), Pays5 = c(1, 1, 0, 0, 0, 0, 0, 0, 0)), .Names =
> c("Nom",
> "Pays1", "Pays2", "Pays3", "Pays4", "Pays5"), row.names = c(1L,
> 3L, 4L, 2L, 5L, 6L, 7L, 8L, 9L), class = "data.frame")
>
>
> I look for a way to build the new dataframe df2
>
> df2 <-
> structure(list(Nom = structure(1:9, .Label = c("A1", "A2", "A3",
> "B1", "B2", "C1", "C2", "C3", "C4"), class = "factor"), Pays1 = c(1,
> 1, 1, 1, 1, 0, 0, 0, 0), Pays2 = c(0, 0, 0, 1, 1, 1, 1, 1, 1),
>      Pays3 = c(0, 0, 0, 1, 1, 0, 0, 0, 0), Pays4 = c(1, 1, 1,
>      0, 0, 1, 1, 1, 1), Pays5 = c(1, 1, 1, 0, 0, 0, 0, 0, 0)), .Names =
> c("Nom",
> "Pays1", "Pays2", "Pays3", "Pays4", "Pays5"), row.names = c(NA,
> -9L), class = "data.frame")
>
> The purpose is to transform df1 it df2 by giving for every group of
> lines A, B and C the value 1 if there is at least a value equal to 1 or
> a value 0 if there is no value equal to 1
>
> Thanks for your helps
>




More information about the R-help mailing list