[R] strange dlply behavior

2009-07-21 Thread Damien Moore
I'm running R 2.9.1 on winXP, using the library plyr.

Can anyone explain to me what is going wrong in this code? (in particular
see lines marked with **) Trying to modify objects in a list
created using dlply seems to corrupt the objects in the list.

 library(plyr)
 d=as.data.frame(cbind(c(1,1,1,2,2,2),c(1,2,3,4,5,6)))
 d
  V1 V2
1  1  1
2  1  2
3  1  3
4  2  4
5  2  5
6  2  6
 c=dlply(d,.(V1))
 c
[[1]]
  V1 V2
1  1  1
2  1  2
3  1  3

[[2]]
  V1 V2
4  2  4
5  2  5
6  2  6

## display an element from the second data frame
 c[[2]][2,2]
[1] 5

## change element in the second data from
 c[[2]][2,2]=10
 c
[[1]]
V1 V2
21  2**
2.1  1  2   **  What happened to V2?
2.2  1  2   **

[[2]]
   V1 V2
4   2  4
NA NA NA **
6   2  6

##Try again with first data frame
 c=dlply(d,.(V1))
 c[[1]][2,2]=10 **
 c
[[1]]
NULL * YIKES!


##Try again but copy c into a new list k
 c=dlply(d,.(V1))
 k=list(c[[1]],c[[2]])
 k[[1]]
  V1 V2
1  1  1
2  1  2
3  1  3
 k[[2]][2,2]=10
 k
[[1]]
  V1 V2
1  1  1
2  1  2
3  1  3

[[2]]
  V1 V2
4  2  4
5  2 10 ***
6  2  6
 k[[1]][2,2]=10
 k
[[1]]
  V1 V2
1  1  1
2  1 10 ***
3  1  3

[[2]]
  V1 V2
4  2  4
5  2 10
6  2  6

[[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.


Re: [R] strange dlply behavior

2009-07-21 Thread hadley wickham
Hi Damien,

This is because of a small bug.  You can work around it by explicitly
using the force function - dlply(d, V1, force).  The default will be
fixed in the next version.

Regards,

Hadley

On Tue, Jul 21, 2009 at 11:18 AM, Damien Mooredamienlmo...@gmail.com wrote:
 I'm running R 2.9.1 on winXP, using the library plyr.

 Can anyone explain to me what is going wrong in this code? (in particular
 see lines marked with **) Trying to modify objects in a list
 created using dlply seems to corrupt the objects in the list.

 library(plyr)
 d=as.data.frame(cbind(c(1,1,1,2,2,2),c(1,2,3,4,5,6)))
 d
  V1 V2
 1  1  1
 2  1  2
 3  1  3
 4  2  4
 5  2  5
 6  2  6
 c=dlply(d,.(V1))
 c
 [[1]]
  V1 V2
 1  1  1
 2  1  2
 3  1  3

 [[2]]
  V1 V2
 4  2  4
 5  2  5
 6  2  6

 ## display an element from the second data frame
 c[[2]][2,2]
 [1] 5

 ## change element in the second data from
 c[[2]][2,2]=10
 c
 [[1]]
    V1 V2
 2    1  2    **
 2.1  1  2   **  What happened to V2?
 2.2  1  2   **

 [[2]]
   V1 V2
 4   2  4
 NA NA NA **
 6   2  6

 ##Try again with first data frame
 c=dlply(d,.(V1))
 c[[1]][2,2]=10 **
 c
 [[1]]
 NULL * YIKES!


 ##Try again but copy c into a new list k
 c=dlply(d,.(V1))
 k=list(c[[1]],c[[2]])
 k[[1]]
  V1 V2
 1  1  1
 2  1  2
 3  1  3
 k[[2]][2,2]=10
 k
 [[1]]
  V1 V2
 1  1  1
 2  1  2
 3  1  3

 [[2]]
  V1 V2
 4  2  4
 5  2 10 ***
 6  2  6
 k[[1]][2,2]=10
 k
 [[1]]
  V1 V2
 1  1  1
 2  1 10 ***
 3  1  3

 [[2]]
  V1 V2
 4  2  4
 5  2 10
 6  2  6

        [[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.




-- 
http://had.co.nz/

__
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.