On Feb 27, 2010, at 8:43 PM, Jorge Ivan Velez wrote:

Hi Juliet,

Here is a suggestion using aggregate():

# aux function
foo <- function(x){
           y <- sum(x, na.rm = TRUE)
           ifelse(y==0, NA, y)
           }

# result
aggregate(df[,-1], list(df$x), foo)

That does work in this example but might give unexpected results if there were sums to 0 of paired -7 and 7's or even multiple values of any sort. (Throwing an error might be a good thing if multiple values in groups were not expected, but such is not reported as an error in this code. ) If the OP :wanted just the first non-NA value within her groups then:

> aggregate(df[,-1], list(df$x), function(x) ifelse(
                                             all(is.na(x)),
                                                  NA,
                                                  na.exclude(x)[1]))
  Group.1 y1 y2 y3 y4
1       3  7 16 12 18
2       6  8 NA NA NA
3      10 NA 11  2 NA
4      14 NA  9 NA  8
5      15 NA NA NA 11
6      50 20 NA 13 NA

Munging the example

> df[2,2] <- 6
>
> aggregate(df[,-1], list(df$x), function(x) ifelse(all(is.na(x)), NA, na.exclude(x)[1]))
  Group.1 y1 y2 y3 y4
1       3  7 16 12 18   # first value taken.
2       6  8 NA NA NA
3      10 NA 11  2 NA
4      14 NA  9 NA  8
5      15 NA NA NA 11
6      50 20 NA 13 NA
> foo <- function(x){
+            y <- sum(x, na.rm = TRUE)
+            ifelse(y==0, NA, y)
+            }
>
> # result
> aggregate(df[,-1], list(df$x), foo)
  Group.1 y1 y2 y3 y4
1       3 13 16 12 18    # summed values appear.
2       6  8 NA NA NA
3      10 NA 11  2 NA
4      14 NA  9 NA  8
5      15 NA NA NA 11
6      50 20 NA 13 NA


Here, df is your data.

HTH,
Jorge


On Sat, Feb 27, 2010 at 7:56 PM, Juliet Ndukum <> wrote:

I wish to rearrange the matrix, df, such that all there are not repeated x values. Particularly, for each value of x that is reated, the corresponded y value should fall under the appropriate column. For example, the x value 3 appears 4 times under the different columns of y, i.e. y1,y2,y3,y4. The output should be such that for the lone value of 3 selected for x, the corresponding row entries with be 7 under column y1, 16 under column y2, 12 under column y3 and 18 under column y4. This should work for the other rows
of x with repeated values.
df
 x y1 y2 y3 y4
1   3  7 NA NA NA
2   3 NA 16 NA NA
3   3 NA NA 12 NA
4   3 NA NA NA 18
5   6  8 NA NA NA
6  10 NA NA  2 NA
7  10 NA 11 NA NA
8  14 NA NA NA  8
9  14 NA  9 NA NA
10 15 NA NA NA 11
11 50 NA NA 13 NA
12 50 20 NA NA NA

The output should be:

 x y1 y2 y3 y4
1   3  7 16 12 18
2   6  8 NA NA NA
3  10 NA 11  2 NA
4  14 NA 9 NA  8
5 15 NA NA NA 11
6 50 20 NA 13 NA

Can any write for me a code that would produce these results.
Thank you in advance for your help.

JN



      [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

David Winsemius, MD
Heritage Laboratories
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to