erstellen von neuen Spalten in der von der Funktion zu dataframe in R

Habe ich eine Reihe von dataframes, die wie folgt Aussehen (Sie haben die gleichen Spalten, nicht die gleiche Menge an Zeilen):

df1 <- data.frame(v = c("banana", "apple", "orange", "grape", "kiwi fruit", "pear"), x = rnorm(6, 0.06, 0.01))
df2 <- data.frame(v = c("table", "chair", "couch", "dresser", "night stand"), x = rnorm(5, 0.06, 0.01))
df3 <- data.frame(v = c("white", "blue", "pink", "bright red", "orange", "dark green", "black"), x = rnorm(7, 0.06, 0.01))

Habe ich eine Reihe von Operationen (zählen von Dingen über die Wörter in df1$v, df2$v, df3$v), dass ich möchte, um auf diese dataframes. Eine Lösung, die ich gefunden ist, um die datframes in einer Liste, und verwenden Sie dann lapply anwenden einer Funktion über alle dataframes in der Liste:

ls <- list(df1, df2, df3)

func1 <- function(dat){
dat$complex <- sapply(strsplit(as.character(dat$v), " "), length)
}

ls_func1 <- lapply(ls, FUN = func1)

ls_func1
[[1]]
[1] 1 1 1 1 2 1
[[2]]
[1] 1 1 1 1 2
[[3]]
[1] 1 1 1 2 1 2 1

Zumindest das wird mir zählt die Anzahl der Wörter in v, die kann ich dann kombinieren, wieder in ein dataframe oder was auch immer.

Das problem ist, es funktioniert anscheinend nicht für jede Funktion. Diese, zum Beispiel, funktioniert gut, wenn Sie getan werden, für ein einzelnes dataframe:

 for(i in 1:length(df1$v)){
 string <- strsplit(as.character(df1$v[i]), "")
 counter <- 0
     for(j in 1:length(string[[1]])){
         if(grepl("a|b|c|d|e", string[[1]][j])){
         counter <- counter + 1
         }
     }
 df1$length[i] <- counter
 }

df1
       v          x     length
1     banana 0.05233752      4
2      apple 0.08564292      2
3     orange 0.04679124      2
4      grape 0.06655950      2
5 kiwi fruit 0.05684803      0
6       pear 0.07654617      2

Aber wenn verwandeln es in eine Funktion, es funktioniert nicht:

func2 <- function(dat){
for(i in 1:length(dat$v)){
string <- strsplit(as.character(dat$v[i]), "")
counter <- 0
    for(j in 1:length(string[[1]])){
        if(grepl("a|b|c|d|e", string[[1]][j])){
        counter <- counter + 1
        }
    }
dat$length[i] <- counter
}
}

ls_func2 <- lapply(ls, FUN = func2)

ls_func2
[[1]]
NULL
[[2]]
NULL
[[3]]
NULL

Was mache ich hier falsch? Und gibt es eine Möglichkeit, neue Spalten zu erstellen, die in meine vorhandenen dataframes mit diesen Funktionen und lapply? In anderen Worten, Sie erstellen die folgende, indem Sie zunächst die Anwendung der ersten Funktion, und dann die Anwendung auf die zweite Funktion:

ls
[[1]]
           v          x complex length
1     banana 0.05233752       1      4
2      apple 0.08564292       1      2
3     orange 0.04679124       1      2
4      grape 0.06655950       1      2
5 kiwi fruit 0.05684803       2      0
6       pear 0.07654617       1      2

[[2]]
           v          x complex length
1      table 0.65790811       1      2
....
[[3]]
....

etc.?

  • Würde der code viel einfacher zu Lesen, wenn Sie stecken mit der üblichen Richtung der Abtretung <-, und verwendet Einrücken. (Aber das problem ist, du bist nicht die Rückgabe der Daten-frame von Ihr Funktionen)
InformationsquelleAutor Annemarie | 2013-08-09
Schreibe einen Kommentar