I'm still not fully understanding exactly how R is handling data frames, but am getting closer. Any help with this one will likely go a long way in getting me there. Let's say I have a data frame, let's call it "a". Within that data frame i have two variables, let's call them "b" and "c", where "b" is a single numeric value per observation, while "c" is a LIST of numeric values. What I want to be able to do is perform an operation on each element in "c" by the single element in "b". So, for example, if I wanted to subtract each element in "c" from the scalar in "b". For example, if i had> a$b[1] 1988 [2] 1989 ? &> a$c[[1]] [1] 1985 1982 1984 [[2]] [1] 1988 1980 ? I'm looking for a result of: a$new [[1]] [1] 3 6 4 [[2]] [1] 1 9 ? I've tried a few different things, none of which have the desired result. Any help appreciated. thanks! jimi adams Assistant Professor Department of Sociology American University e: jadams at american.edu w: jimiadams.com
HI, You can get the results you wanted by: c=list(c(1985,1982,1984),c(1988,1980),c(1983,1984),c(1988,1998,1993),c(1993,1994,1998)) b1<-list(1988,1989,1990,1991,1992) for(i in 1:length(b1)){ ?anew[[i]]<-list() ?anew[[i]]<-b1[[i]]-c[[i]] ?} ?anew [[1]] [1] 3 6 4 [[2]] [1] 1 9 ------- ------- But, if you wanted both both a list and a vector in a dataframe "a" It is possible: b<-c(1988,1989,1990,1991,1992) c=list(c(1985,1982,1984),c(1988,1980),c(1983,1984),c(1988,1998,1993),c(1993,1994,1998)) ?a<-data.frame(b,c1=cbind(c)) ?a #???? b??????????????? c #1 1988 1985, 1982, 1984 #2 1989?????? 1988, 1980 #3 1990?????? 1983, 1984 #4 1991 1988, 1998, 1993 #5 1992 1993, 1994, 1998 anew1<-list() for(i in 1:nrow(a)){ ?anew1[[i]]<-list() ?anew1[[i]]<-a$b[i]-a$c[[i]] ?}> anew1[[1]] [1] 3 6 4 [[2]] [1] 1 9 [[3]] [1] 7 6 [[4]] [1]? 3 -7 -2 [[5]] [1] -1 -2 -6 A.K. ----- Original Message ----- From: jimi adams <jadams at american.edu> To: r-help at r-project.org Cc: Sent: Thursday, August 9, 2012 4:42 PM Subject: [R] indexing in data frames I'm still not fully understanding exactly how R is handling data frames, but am getting closer. Any help with this one will likely go a long way in getting me there. Let's say I have a data frame, let's call it "a". Within that data frame i have two variables, let's call them "b" and "c", where "b" is a single numeric value per observation, while "c" is a LIST of numeric values. What I want to be able to do is perform an operation on each element in "c" by the single element in "b". So, for example, if I wanted to subtract each element in "c" from the scalar in "b". For example, if i had> a$b[1] 1988 [2] 1989 ? &> a$c[[1]] [1] 1985 1982 1984 [[2]] [1] 1988 1980 ? I'm looking for a result of: a$new [[1]] [1] 3 6 4 [[2]] [1] 1 9 ? I've tried a few different things, none of which have the desired result. Any help appreciated. thanks! jimi adams Assistant Professor Department of Sociology American University e: jadams at american.edu w: jimiadams.com ______________________________________________ R-help at 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.
HI, In the reply I sent, I forgot to add, anew<-list()#before, for(i in 1:length(b1)){ ?anew[[i]]<-list() ?anew[[i]]<-b1[[i]]-c[[i]] ?} A.K. ----- Original Message ----- From: jimi adams <jadams at american.edu> To: r-help at r-project.org Cc: Sent: Thursday, August 9, 2012 4:42 PM Subject: [R] indexing in data frames I'm still not fully understanding exactly how R is handling data frames, but am getting closer. Any help with this one will likely go a long way in getting me there. Let's say I have a data frame, let's call it "a". Within that data frame i have two variables, let's call them "b" and "c", where "b" is a single numeric value per observation, while "c" is a LIST of numeric values. What I want to be able to do is perform an operation on each element in "c" by the single element in "b". So, for example, if I wanted to subtract each element in "c" from the scalar in "b". For example, if i had> a$b[1] 1988 [2] 1989 ? &> a$c[[1]] [1] 1985 1982 1984 [[2]] [1] 1988 1980 ? I'm looking for a result of: a$new [[1]] [1] 3 6 4 [[2]] [1] 1 9 ? I've tried a few different things, none of which have the desired result. Any help appreciated. thanks! jimi adams Assistant Professor Department of Sociology American University e: jadams at american.edu w: jimiadams.com ______________________________________________ R-help at 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.
Thanks. Yes, I got it to work with loops for small data. I was just hoping, given the size of the data.frame (hundreds of thousands) and the length of the lists (varying up to a few hundred) to avoid that if at all possible. Perhaps I'm expecting some behavior that's not feasible? cheers, jimi On 09Aug, 2012, at 17:39 , arun wrote:> HI, > > In the reply I sent, I forgot to add, > > anew<-list()#before, > for(i in 1:length(b1)){ > anew[[i]]<-list() > anew[[i]]<-b1[[i]]-c[[i]] > } > > A.K. > > ----- Original Message ----- > From: jimi adams <jadams at american.edu> > To: r-help at r-project.org > Cc: > Sent: Thursday, August 9, 2012 4:42 PM > Subject: [R] indexing in data frames > > I'm still not fully understanding exactly how R is handling data frames, but am getting closer. Any help with this one will likely go a long way in getting me there. Let's say I have a data frame, let's call it "a". Within that data frame i have two variables, let's call them "b" and "c", where "b" is a single numeric value per observation, while "c" is a LIST of numeric values. What I want to be able to do is perform an operation on each element in "c" by the single element in "b". > > So, for example, if I wanted to subtract each element in "c" from the scalar in "b". For example, if i had > >> a$b > [1] 1988 > [2] 1989 > ? > & >> a$c > [[1]] > [1] 1985 1982 1984 > [[2]] > [1] 1988 1980 > ? > > I'm looking for a result of: > a$new > [[1]] > [1] 3 6 4 > [[2]] > [1] 1 9 > ? > > I've tried a few different things, none of which have the desired result. Any help appreciated. > thanks! > > jimi adams > Assistant Professor > Department of Sociology > American University > e: jadams at american.edu > w: jimiadams.com > > ______________________________________________ > R-help at 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. >
You have not defined a data frame since data frames cannot contain lists, but lists can contain data frames so you are asking about how to process a list. I'm changing your object names to a, b, and d because c() is the concatenation function and it can cause all kinds of problems to use it as an object name.> a <- list(b=c(1988, 1989), d=list(c(1985, 1982, 1984), c(1988, 1980))) > a$b [1] 1988 1989 $d $d[[1]] [1] 1985 1982 1984 $d[[2]] [1] 1988 1980> a$b; a[[1]] # Two ways to refer to the first element of the list[1] 1988 1989 [1] 1988 1989> a$d; a[[2]] # Two ways to refer to the second element of the list[[1]] [1] 1985 1982 1984 [[2]] [1] 1988 1980 [[1]] [1] 1985 1982 1984 [[2]] [1] 1988 1980> a[[2]][[1]]; a$d[[1]] # Two ways to refer to the 1st element of the 2ndelement [1] 1985 1982 1984 [1] 1985 1982 1984> a[[2]][[2]]; a$d[[2]] # Two ways to refer to the 2nd element of the 2ndelement [1] 1988 1980 [1] 1988 1980> a$new <- sapply(1:2, function(i) a$b[i] - a$d[[i]]) > a$new[[1]] [1] 3 6 4 [[2]] [1] 1 9 You can do all this with a data.frame if you think about it differently:> a <- data.frame(year = c(1988, 1989), group = c("G1988", "G1989")) > b <- data.frame(group = c(rep("G1988", 3), rep("G1989", 2)),d = c(1985, 1982, 1984, 1988, 1980))> ab <- merge(a, b) > ab <- data.frame(ab, diff=ab$year-ab$d) > new <- split(ab$diff, ab$group) > new$G1988 [1] 3 6 4 $G1989 [1] 1 9 ---------------------------------------------- David L Carlson Associate Professor of Anthropology Texas A&M University College Station, TX 77843-4352> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r- > project.org] On Behalf Of jimi adams > Sent: Thursday, August 09, 2012 3:43 PM > To: r-help at r-project.org > Subject: [R] indexing in data frames > > I'm still not fully understanding exactly how R is handling data > frames, but am getting closer. Any help with this one will likely go a > long way in getting me there. Let's say I have a data frame, let's call > it "a". Within that data frame i have two variables, let's call them > "b" and "c", where "b" is a single numeric value per observation, while > "c" is a LIST of numeric values. What I want to be able to do is > perform an operation on each element in "c" by the single element in > "b". > > So, for example, if I wanted to subtract each element in "c" from the > scalar in "b". For example, if i had > > > a$b > [1] 1988 > [2] 1989 > . > & > > a$c > [[1]] > [1] 1985 1982 1984 > [[2]] > [1] 1988 1980 > . > > I'm looking for a result of: > a$new > [[1]] > [1] 3 6 4 > [[2]] > [1] 1 9 > . > > I've tried a few different things, none of which have the desired > result. Any help appreciated. > thanks! > > jimi adams > Assistant Professor > Department of Sociology > American University > e: jadams at american.edu > w: jimiadams.com > > ______________________________________________ > R-help at 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.