这是一个玩具的例子,我总是写一个循环.我无法找出一个班轮.我确定我已经看过了,但它并没有坚持下去.
smallFrame <- data.frame(colA = c('A', 'B', 'C' ,'D'), colB = c(1,1,1,1))
someList <- list(A=20, B=30, C=40, D=50)
for(letter in names(someList)){
smallFrame[smallFrame$colA==letter, 'newColumn'] <- someList[[letter]]
}
Run Code Online (Sandbox Code Playgroud)
如何在一行中完成循环?这不会这样做.
lapply(names(someList), function(x) {smallFrame[smallFrame$colA==x, 'newColumn'] <- someList[[x]]})
Run Code Online (Sandbox Code Playgroud)
Mat*_*erg 10
丑陋,但有效:
lapply(names(someList), function(x) {smallFrame[smallFrame$colA==x, 'newColumn'] <<- someList[[x]]})
Run Code Online (Sandbox Code Playgroud)
请注意<<-.它无法使用<-的原因是在函数内修改了someList的副本.
这里的"丑陋"意味着你永远不应该使用这种语法,原因有两个.首先,具有副作用的功能容易出错.其次,lapply忽略返回值.这些都表明显式循环是最好的.
@thelatemail不那么难看,几乎被盗了:
smallFrame$newColumn <- unlist(someList[match(smallFrame$colA, names(someList))])
Run Code Online (Sandbox Code Playgroud)
例:
smallFrame <- data.frame(colA = c('A', 'B', 'C' ,'D', 'A'), colB = c(1,1,1,1,1))
> smallFrame
> smallFrame
colA colB
1 A 1
2 B 1
3 C 1
4 D 1
5 A 1
smallFrame$newColumn <- unlist(someList[match(smallFrame$colA, names(someList))])
> smallFrame
colA colB newColumn
1 A 1 20
2 B 1 30
3 C 1 40
4 D 1 50
5 A 1 20
Run Code Online (Sandbox Code Playgroud)
这是一个简单的合并,如果你smallList适当地重塑你的
# reshape2 for melt.
library(reshape2)
# slightly expanded version with duplicate colA == A
smallFrame <- data.frame(colA = c('A', 'A', 'B', 'C' ,'D'), colB = c(1,2,1,1,1))
someList <- list(A=20, B=30, C=40, D=50)
merge(smallFrame, melt(someList), by.x = 'colA', by.y = 'L1')
colA colB value
1 A 1 20
2 A 2 20
3 B 1 30
4 C 1 40
5 D 1 50
Run Code Online (Sandbox Code Playgroud)
或者,如果您真的热衷于在smallFrame内有效地分配,请使用 data.table
library(data.table)
smallDT <- data.table(smallFrame, key = 'colA')
someDT <- data.table(melt(someList), key = 'L1')
# left join smallDT and someDT, assigning the `value` column by reference
# within smallDT as the column `newColumn`
smallDT[someDT, newColumn := value]
smallDT
colA colB newColumn
1: A 1 20
2: A 2 20
3: B 1 30
4: C 1 40
5: D 1 50
Run Code Online (Sandbox Code Playgroud)