Ich versuche zu setze Operationen zwischen den Vektoren in einer Liste Spalte wie this gespeichert.setze Operation innerhalb einer Listenspalte
DT <- data.table(exp = c("exp1", "exp2", "exp2"),
sample = c(1L, 1L, 2L),
listdata = list(c(2L,5L), c(2L,3L,5L,7L), c(1L,2L,6L)))
> DT
exp sample listdata
1: exp1 1 2,5
2: exp2 1 2,3,5,7
3: exp2 2 1,2,6
während sehr umständlich, kann ich
DT$inc = list(setdiff(unlist(DT$listdata[2]), unlist(DT$listdata[1])))
tun und eine neue Liste Spalte mit dem Wert c(3,7)
erhalten. Aber wenn ich versuche, den Unterschied zwischen der aktuellen Zeile zu berechnen und der ersten Reihe mit
DT$inc = list(list(setdiff(unlist(DT$listdata, recursive = FALSE), unlist(DT$listdata[1]))))
erwarten Sie eine neue Spalte „inc“
0
c(3,7)
c(1,6)
ich c(3,7,1,6)
. Anscheinend unlist
flachte die ganze Liste Spalte zusammen. Irgendeine Idee was ist los?
Ich lerne auch dplyr und data.table. Es würde also wirklich helfen, wenn Sie Lösungen mit einer von ihnen anbieten können.
Die answe rs kommen schnell. Kannst du die Verwendung von 'listdata [1L]' erklären? Die 'dplyr' Version unten muss' [[''. Außerdem bin ich nicht sicher, ob es eine gute Idee ist, die Liste auf mehrere Zeilen zu verteilen, wenn die Listenlänge sehr lang ist. – Dong
@Dong Yeah, ich habe diesen Unterschied auch bemerkt. 'listdata [[1]]' (in Psidoms Antwort) ist das erste Element der Wahrheit; während 'listdata [1]' ein * slice * der Liste ist, die nur das erste Element enthält. Also, wenn "Lst = list (11, 22)", dann ist "Lst [[1]]" '11', während' Lst [1] '' list (11) 'ist. Das 'L' in' 1L' verwendet nur eine ganzzahlige Version von 1. – Frank
Der Grund, warum ich einen brauche und er den anderen braucht, liegt in Rs Konzept des "Recyclings" und den Unterschieden in den zwei Funktionen, die wir benutzt haben. Wenn Sie über das Recycling und die Dokumente '? Lapply' und'? Map' lesen, sollte es hoffentlich Sinn machen. Wenn nicht, probieren Sie vielleicht den Chat aus: http://chat.stackoverflow.com/rooms/25312/r-public – Frank