2014-02-24 63 views
1

在R,一些功能應用到一列,你可以這樣做:如何在嵌套列表中以不同大小的數據框的列應用函數?

df$col <- someFunction(df$col) 

現在的問題是,你怎麼當你有數據幀嵌套列表中的類似的任務? 假設我有一個像這樣的下面的列表,其中我有從根第二級數據框。

          +------+------+ 
            type1 | id | name | 
           +----------->|------|------| 
           |   |  |  | 
           |   |  |  | 
       year1   |   +------+------+ 
      +------------------+ 
      |     | 
      |     |   +------+------+-----+ 
      |     | type2  | meta1|meta2 | name| 
      |     +----------> |------|------|-----| 
      |        |  |  |  | 
      +        +------+------+-----+ 
      |      type1 +------+------+ 
      |     +---------> | id |name | 
      |     |   |------|------| 
      |  year2  |   |  |  | 
    list +----------------->+   |  |  | 
      +     |   +------+------+ 
      |     | type2  +------+------+-----+ 
      |     +---------> | meta1|meta2 |name | 
      |        |------|------|-----| 
      |        |  |  |  | 
      |     type1  +------+------+-----+ 
      |     +----------> +------+------+ 
      |     |    | id |name | 
      |  year3  |    |------|------| 
      +-----------------+    |  |  | 
          |    |  |  | 
          | type2  +------+------+ 
          +----------> +------+------+-----+ 
              |meta1 | meta2|name | 
              |------|------|-----| 
              |  |  |  | 
              +------+------+-----+ 

而且我想修改樹葉中每個數據框中的「名稱」列,並將結果存儲在那裏。你是怎樣做的?

下面是示例數據:

data<-list() 

data$yr2001$type1 <- df_2001_1 <- data.frame(index=1:3,name=c("jack","king","larry")) 
data$yr2001$type2 <- df_2001_2 <- data.frame(index=1:5,name=c("man","women","oliver","jack","jill")) 
data$yr2002$type1 <- df_2002_1 <- data.frame(index=1:3,name=c("janet","king","larry")) 
data$yr2002$type2 <- df_2002_2 <- data.frame(index=1:5,name=c("alboyr","king","larry","rachel","sam")) 
data$yr2003$type1 <- df_2003_1 <- data.frame(index=1:3,name=c("dan","jay","zang")) 
data$yr2003$type2 <- df_2003_2 <- data.frame(index=1:5,name=c("zang","king","larry","kim","fran")) 

說,我想在存儲在列表

+1

請發佈您的數據的代表性樣本。 –

+1

我的一般建議是不以這種方式組織你的數據。它看起來像我在這裏有兩個(或可能只是一個)未融化的數據幀。 – joran

回答

2

爲了說明(使用簡化的例子):

library(reshape2) 
dat1 <- melt(data,id.vars = c("index","name")) 
> dat1$NAME <- toupper(dat1$name) 
+1

我最終使用這種解決方案,雖然它不直接回答我提出的問題(與其他使用'lapply'的解決方案相比,我改爲提升)。通過以這種方式組織數據,您是正確的,它解決了所有下游問題並使分析變得簡單。就好像我要求一匹更快的馬,而且你給了我一輛車 – Alby

2

可以嵌套lapply函數兩次,每次數據幀的名字列到大寫的所有名稱中獲取內部數據框。在這裏,我申請toupper每個name變量:

result <- lapply(data, function(x) { 
    lapply(x, function(y) { 
    y$name = toupper(y$name) 
    return(y) 
    }) 
}) 
result 

# $yr2001 
# $yr2001$type1 
# index name 
# 1  1 JACK 
# 2  2 KING 
# 3  3 LARRY 
# 
# $yr2001$type2 
# index name 
# 1  1 MAN 
# 2  2 WOMEN 
# 3  3 OLIVER 
# 4  4 JACK 
# 5  5 JILL 
# 
# 
# $yr2002 
# $yr2002$type1 
# index name 
# 1  1 JANET 
# 2  2 KING 
# 3  3 LARRY 
# 
# $yr2002$type2 
# index name 
# 1  1 ALBOYR 
# 2  2 KING 
# 3  3 LARRY 
# 4  4 RACHEL 
# 5  5 SAM 
# 
# 
# $yr2003 
# $yr2003$type1 
# index name 
# 1  1 DAN 
# 2  2 JAY 
# 3  3 ZANG 
# 
# $yr2003$type2 
# index name 
# 1  1 ZANG 
# 2  2 KING 
# 3  3 LARRY 
# 4  4 KIM 
# 5  5 FRAN 
+0

josilber,也許我誤解了,但這是真正的遞歸,還是隻是兩個嵌套循環?另外,我希望你不介意在我的例子中借用'toupper'。 – BrodieG

+0

謝謝 - 更新了措辭。當然'toupper'借用是好的:) – josliber

3

我同意@ joran的評論上面---這是乞討,加入類型列進行合併。但是這裏有一個方法rapply。這假定name列是每個嵌套data.frame中唯一的factor列。正如在@ josilber的回答中,我選擇的功能是toupper

rapply(data, function(x) toupper(as.character(x)), classes='factor', how='replace') 

這將丟棄data.frame類,但基本結構被保留。如果你的名字欄已經是character,那麼你會使用。

rapply(data, toupper, classes='character', how='replace') 
1

這是基於lapply一個真正的遞歸版本(也就是將與更深的嵌套的工作),並不會使不同之處在於任何其他假設你有唯一的終端類型是數據幀。不幸的是rapply不會停止在data.frames的遞歸,所以如果你想操作數據框(否則Matthew的答案是完美的),你必須使用lapply

samp.recur <- function(x) 
    lapply(x, 
    function(y) 
     if(is.data.frame(y)) transform(y, name=toupper(name)) else samp.recur(y)) 

這將產生:

samp.recur(data) 
# $yr2001 
# $yr2001$type1 
# index name 
# 1  1 JACK 
# 2  2 KING 
# 3  3 LARRY 

# $yr2001$type2 
# index name 
# 1  1 MAN 
# 2  2 WOMEN 
# 3  3 OLIVER 
# 4  4 JACK 
# 5  5 JILL 

# etc... 

雖然我也同意其他人,你可能要考慮重新構建數據。

相關問題