2016-12-29 3 views
0

Ich arbeite in R mit 10 Listen (files1, files2, files3, ... files10). Jede Liste enthält mehrere Datenrahmen.R - Verwendung von Listennamen in einer For-Schleife

Jetzt möchte ich einige Werte aus jedem Datenrahmen in jeder Liste extrahieren.

ich eine

for-Schleife verwenden, würde
nt = c("A", "C", "G", "T") 
for (i in files1) { 
    for (j in nt) { 
     name = paste(j, i, sep = "-") # here I want as output name = "files1-A". However this doesn't work. How can I get the name of the list "files1"? 
     colname = paste("percentage", j, sep = "") # here I was as output colname = percentageA. This works 
     assign(name, unlist(lapply(i, function(x) x[here I want to use the column with the name "percentageA", so 'colname'][x$position==1000]))) 
    } 
} 

Also, ich habe Probleme Namen von Listen und Zuweisen sie Variablen.

Ich weiß nur Schleife durch die erste Liste, aber ist es auch möglich, sofort alle meine Listen durchlaufen?

Mit anderen Worten: Wie kann ich den folgenden Code in eine for-Schleife einfügen? Ich erstelle eine gefälschte Liste mit Datenrahmen

A_files1 = unlist(lapply(files1, function(x) x$percentageA[x$position==1000])) 
C_files1 = unlist(lapply(files1, function(x) x$percentageC[x$position==1000])) 
G_files1 = unlist(lapply(files1, function(x) x$percentageG[x$position==1000])) 
T_files1 = unlist(lapply(files1, function(x) x$percentageT[x$position==1000])) 

A_files2 = unlist(lapply(files2, function(x) x$percentageA[x$position==1000])) 
C_files2 = unlist(lapply(files2, function(x) x$percentageC[x$position==1000])) 
G_files2 = unlist(lapply(files2, function(x) x$percentageG[x$position==1000])) 
T_files2 = unlist(lapply(files2, function(x) x$percentageT[x$position==1000])) 

.... 

A_files10 = unlist(lapply(files10, function(x) x$percentageA[x$position==1000])) 
C_files10 = unlist(lapply(files10, function(x) x$percentageC[x$position==1000])) 
G_files10 = unlist(lapply(files10, function(x) x$percentageG[x$position==1000])) 
T_files10 = unlist(lapply(files10, function(x) x$percentageT[x$position==1000])) 
+0

Funktioniert 'name (fileS1)' 'NULL'? –

+0

@ joel.wilson: Ja, es tut – user1987607

+0

Es wäre toll, Beispieldaten, zum Beispiel 2-3 Dateien zu haben, um Beispiel zu haben. Siehe [wie man ein reproduzierbares Beispiel erstellt] (http: // stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproduzierbar-Beispiel/5965451 # 5965451). Im Allgemeinen erzeuge ich zum Lesen mehrerer Dateien eine Funktion (variable1, variable2), die einen Datenrahmen aus einer einzigen Datei zurückgibt. Dann benutze ich das Paket 'dplyr' mit' group_by (variable1, variable2) '' do (myfunction (. $ Variable1,. $ Variable2)) 'um mehrere Dateien zu lesen. Das ist großartig, um alle Daten in einem einzigen Datenrahmen zu erhalten. –

Antwort

0

Um Ihre Frage zu beantworten:

n = data.frame(andrea=c(1983, 11, 8),paja=c(1985, 4, 3)) 
s = data.frame(col1=c("aa", "bb", "cc", "dd", "ee")) 
b = data.frame(col1=c(TRUE, FALSE, TRUE, FALSE, FALSE)) 
x = list(n, s, b, 3) # x contains copies of n, s, b 
names(x) <- c("dataframe1","dataframe2","dataframe3","dataframe4") 
files1 = x 

nun in der Eingabe, was in der Schleife passiert:

i = files1 
j = "A" 

Wenn Sie das wollen, Namen Ihrer Datenrahmen mit dem Pedix in NT enthalten (in diesem Fall ist es nt = "A") müssen Sie Namen (i) verwenden:

012 So

Sie erhalten:

> name 
[1] "dataframe1-A" "dataframe2-A" "dataframe3-A" "dataframe4-A" 

Ich hoffe, es ist das, was Sie brauchen.

+0

Dies ist nicht genau das, was ich will. Ich möchte nicht alle meine Datenfelder benennen, ich möchte nur den Namen meiner Listen verwenden. – user1987607

+1

Wie wäre es, wenn Sie alle Ihre Listen in eine Liste einfügen: 'biglist <- list (files1 = files1)' 'Namen (biglist)' wird Ihnen '[1]" files1 "' zurückgeben. –

0

Ich denke, diese Daten wären einfacher zu manipulieren, wenn Sie die Datenstruktur reduzieren. Anstelle von 10 Listen von Datenrahmen könnten Sie einen einzelnen Datenrahmen mit allen Beobachtungen verwenden, die durch ihre Namen und Dateinamen indiziert werden.

Beispieldaten generieren und Code von der Frage

Vereinfachte Daten mit je Artikel nur 10 oder 11 Punkte verwenden Ich nehme Elemente in der Liste eine unterschiedliche Anzahl von Zeilen haben?

files1 <- list(item1 = data.frame(position = 1:10, 
            percentageA = 1:10/10, 
            percentageC = 1:10/10, 
            percentageG = 1:10/10, 
            percentageT = 1:10/10), 
       item2 = data.frame(position = 1:11, 
            percentageA = 1:11/20, 
            percentageC = 1:11/20, 
            percentageG = 1:11/20, 
            percentageT = 1:11/20)) 
str(file) 

# Select the 9th position using your code 
A_files1 = unlist(lapply(files1, function(x) x$percentageA[x$position==9])) 
C_files1 = unlist(lapply(files1, function(x) x$percentageC[x$position==9])) 
G_files1 = unlist(lapply(files1, function(x) x$percentageG[x$position==9])) 
T_files1 = unlist(lapply(files1, function(x) x$percentageT[x$position==9])) 

Flatten die Liste der Datenrahmen in einem Datenrahmen

# Add name to each data frame 
# Inspired by this answer 
# http://stackoverflow.com/a/18434780/2641825 


# For information l[1] creates a single list item 
# l[[1]] extracts the data frame from the list 
#' @param i index 
#' @param listoffiles list of data frames 
addname <- function(i, listoffiles){ 
    dtf <- listoffiles[[i]] # Extract the dataframe from the list 
    dtf$name <- names(listoffiles[i]) # Add the name inside the data frame 
    return(dtf) 
} 
# Add the name inside each data frame 
files1 <- lapply(seq_along(files1), addname, files1) 
str(files1) # look at the structure of the list 
files1table <- Reduce(rbind,files1) 

# Get the values of interest with 
files1table$percentageA[files1table$position == 9] 
# [1] 0.90 0.45 

# Get all Letters of interest with 
subset(files1table,position==9) 

# position percentageA percentageC percentageG percentageT name 
# 9   9  0.90  0.90  0.90  0.90 item1 
# 19  9  0.45  0.45  0.45  0.45 item2 

Flatten alle Ihre Listen von Listen von Datenrahmen in einem einzigen Datenrahmen

# Now create anoter list, files2, duplicate just for the sake of the example 
files2 <- files1 
# file1 and file2 both have a name column inside their dataframes already 
# Create a list of list of dataframes 
lolod <- list(files1 = files1, files2 = files2) 
str(lolod) # a list of lists 
# Flatten to a list of dataframes 
# Use sapply to keep names based on this answer http://stackoverflow.com/a/9469981/2641825 
lod <- sapply(lolod, Reduce, f=rbind, simplify = FALSE, USE.NAMES = TRUE) 
# Add the name inside each data frame again 
addfilename <- function(i, listoffiles){ 
    dtf <- listoffiles[[i]] # Extract the dataframe from the list 
    dtf$filename <- names(listoffiles[i]) # Add the name inside the data frame 
    return(dtf) 
} 
lod <- lapply(seq_along(lod), addfilename, lod) 


# Flatten to a dataframe 
d <- Reduce(rbind, lod) 
# Now the data structure is flattened and much easier to deal with 

subset(d,position==9) 
# position percentageA percentageC percentageG percentageT name filename 
# 9   9  0.90  0.90  0.90  0.90 item1 files1 
# 19  9  0.45  0.45  0.45  0.45 item2 files1 
# 30  9  0.90  0.90  0.90  0.90 item1 files2 
# 40  9  0.45  0.45  0.45  0.45 item2 files2 

Diese Antwort ist viel länger, als ich es erwartet sein. Ich hoffe, ich habe dich nicht erschreckt. Inspiriert von tidy data erleichtert die Vereinfachung der Datenstruktur Ihre Arbeit später. Diese komplexe Listenumbenennung wäre wahrscheinlich nicht notwendig gewesen, wenn Sie Namen innerhalb der Originaldaten angegeben hätten.

Verwandte Themen