Re: [R] Combine list element by column name to make a dataframe

2015-04-06 Thread Duncan Mackay
forgot to cc to list

have a look at https://stat.ethz.ch/pipermail/r-help/2012-January/300275.html

and other messages in the sequence

if you use Marc Schwartz's list2df you with have to transpose  it with t()

Duncan

Duncan Mackay
Department of Agronomy and Soil Science
University of New England
Armidale NSW 2351
Email: home: mac...@northnet.com.au

-Original Message-
From: R-help [mailto:r-help-boun...@r-project.org] On Behalf Of Mohammad Tanvir 
Ahamed via R-help
Sent: Monday, 6 April 2015 16:06
To: r-help@r-project.org
Subject: [R] Combine list element by column name to make a dataframe

Hi ,�

I have a example list like follow�




lst-list(setNames(c(1,10,50,60,70,80),c(id,id1,math,phy,che,bio)),setNames(c(2,20,45),c(id,id1,phy)),setNames(c(3,30,75),c(id,id1,bio)))


My expected outcome :�

-

df-rbind(c(1,10,50,60,70,80),c(2,20,NA,45,NA,NA),c(3,30,NA,NA,NA,75))

colnames(df)-c(id,id1,math,phy,che,bio)

row.names(df) - NULL

df




Any suggestion will be appreciated .�

Thanks in advance.

�

Best regards


...�

Tanvir Ahamed

G�teborg, Sweden




[[alternative HTML version deleted]]

__
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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] Combine list element by column name to make a dataframe

2015-04-06 Thread Michael Hannon
Maybe something like the appended?

-- Mike

lst - list(setNames(c(1,10,50,60,70,80),
 c(id,id1,math,phy,che,bio)),
setNames(c(2,20,45),
 c(id,id1,phy)),
setNames(c(3,30,75),
 c(id,id1,bio)))

lst


df - rbind(c(1,10,50,60,70,80),
c(2,20,NA,45,NA,NA),
c(3,30,NA,NA,NA,75))

colnames(df)-c(id,id1,math,phy,che,bio)
row.names(df) - NULL

df

allNames - unique(unlist(lapply(lst, names)))
allNames

newLst - lapply(lst, function(element) {
element[allNames]
})
newLst

df2 - do.call(rbind, newLst)
df2

all.equal(df, df2)

On Sun, Apr 5, 2015 at 11:05 PM, Mohammad Tanvir Ahamed via R-help
r-help@r-project.org wrote:
 Hi ,

 I have a example list like follow


 

 lst-list(setNames(c(1,10,50,60,70,80),c(id,id1,math,phy,che,bio)),setNames(c(2,20,45),c(id,id1,phy)),setNames(c(3,30,75),c(id,id1,bio)))


 My expected outcome :

 -

 df-rbind(c(1,10,50,60,70,80),c(2,20,NA,45,NA,NA),c(3,30,NA,NA,NA,75))

 colnames(df)-c(id,id1,math,phy,che,bio)

 row.names(df) - NULL

 df

 


 Any suggestion will be appreciated .

 Thanks in advance.



 Best regards


 ...

 Tanvir Ahamed

 Göteborg, Sweden




 [[alternative HTML version deleted]]


 __
 R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
 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.

__
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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] Combine list element by column name to make a dataframe

2015-04-06 Thread peter dalgaard

 On 06 Apr 2015, at 08:05 , Mohammad Tanvir Ahamed via R-help 
 r-help@r-project.org wrote:
 
 Hi ,�
 
 I have a example list like follow�
 
 
 
 
 lst-list(setNames(c(1,10,50,60,70,80),c(id,id1,math,phy,che,bio)),setNames(c(2,20,45),c(id,id1,phy)),setNames(c(3,30,75),c(id,id1,bio)))
 
 
 My expected outcome :�
 
 -
 
 df-rbind(c(1,10,50,60,70,80),c(2,20,NA,45,NA,NA),c(3,30,NA,NA,NA,75))
 
 colnames(df)-c(id,id1,math,phy,che,bio)
 
 row.names(df) - NULL
 
 df
 
 
 
 
 Any suggestion will be appreciated .�

Hmm, in principle this looks like a merge() problem, if you first convert each 
list element to a data frame. That could be painful to get right though.

You could try something like this:

 nm - Reduce(union, lapply(lst, names)) # or just type it in
 nm
[1] id   id1  math phy  che  bio 
 blank - setNames(rep(NA_real_, length(nm)), nm)
 fill1 - function(x, blank) {blank[names(x)] - x; blank}
 lapply(lst, fill1, blank)
[[1]]
  id  id1 math  phy  che  bio 
   1   10   50   60   70   80 

[[2]]
  id  id1 math  phy  che  bio 
   2   20   NA   45   NA   NA 

[[3]]
  id  id1 math  phy  che  bio 
   3   30   NA   NA   NA   75 

 do.call(rbind,lapply(lst, fill1, blank))
 id id1 math phy che bio
[1,]  1  10   50  60  70  80
[2,]  2  20   NA  45  NA  NA
[3,]  3  30   NA  NA  NA  75

(NB, this is a matrix, not a data frame, but so is your df!)

Notice that this does not do a proper merge on the id fields, i.e. if you have 
two different records with different grades (say one with che and another 
with phy) on the same id, you get two records, not one. However, that might 
well be what you wanted.

(It is tempting to use 

 fill1 - function(x) `[-`(blank, names(x), x)
 lapply(lst, fill1)

which does seem to work, but should probably be avoided because of the risk of 
destructive modification.) 


 
 Thanks in advance.
 
 �
 
 Best regards
 
 
 ...�
 
 Tanvir Ahamed
 
 G�teborg, Sweden
 
 
 
 
   [[alternative HTML version deleted]]
 
 __
 R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
 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.

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd@cbs.dk  Priv: pda...@gmail.com

__
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.