我有一个包含4列的数据框:
myData<-mtcars[1:20,1:4]
也是一个具有相同列名的列表:
myList<-list(mpg=c(1,2,3), cyl=c(2,10), disp=integer(0), hp=c(3))
如何根据列表的相应向量更改数据框每列的值?
所以我想设置myData$mpg
的第一行,第二行和第三行,myData$cyl
的第二行和第十行等等。 NA。
我尝试过以下行,但不起作用。
mapply(function(x, y)y[x, names(x)]<-NA, myList, myData, SIMPLIFY=FALSE)
y [x,names(x)]中的错误:维数不正确
答案 0 :(得分:3)
我们可以这样使用mapply
。如果您不需要结果的row.names:
mapply(function(data, index) {data[index] <- NA; data}, myData, myList)
应该足够了。否则,您可以手动分配row.names。
`row.names<-`(mapply(function(data, index) {data[index] <- NA; data}, myData, myList),
rownames(myData))
mpg cyl disp hp
Mazda RX4 NA 6 160.0 110
Mazda RX4 Wag NA NA 160.0 110
Datsun 710 NA 4 108.0 NA
Hornet 4 Drive 21.4 6 258.0 110
Hornet Sportabout 18.7 8 360.0 175
Valiant 18.1 6 225.0 105
Duster 360 14.3 8 360.0 245
Merc 240D 24.4 4 146.7 62
Merc 230 22.8 4 140.8 95
Merc 280 19.2 NA 167.6 123
Merc 280C 17.8 6 167.6 123
Merc 450SE 16.4 8 275.8 180
Merc 450SL 17.3 8 275.8 180
Merc 450SLC 15.2 8 275.8 180
Cadillac Fleetwood 10.4 8 472.0 205
Lincoln Continental 10.4 8 460.0 215
Chrysler Imperial 14.7 8 440.0 230
Fiat 128 32.4 4 78.7 66
Honda Civic 30.4 4 75.7 52
Toyota Corolla 33.9 4 71.1 65
答案 1 :(得分:3)
循环序列的另一个选择
myData[] <- lapply(seq_along(myList), function(i) {
myData[i][myList[[i]],] <- NA
myData[[i]]})
head(myData)
# mpg cyl disp hp
#Mazda RX4 NA 6 160 110
#Mazda RX4 Wag NA NA 160 110
#Datsun 710 NA 4 108 NA
#Hornet 4 Drive 21.4 6 258 110
#Hornet Sportabout 18.7 8 360 175
#Valiant 18.1 6 225 105
答案 2 :(得分:2)
我能想到的一个解决方案如下:
sapply(names(myList), function(x) {myData[myList[[x]], x] <<- NA})
我没有使用mapply
,但您的问题可能是“全局”问题。分配
提供输出:
myData
mpg cyl disp hp
Mazda RX4 NA 6 160.0 110
Mazda RX4 Wag NA NA 160.0 110
Datsun 710 NA 4 108.0 NA
Hornet 4 Drive 21.4 6 258.0 110
Hornet Sportabout 18.7 8 360.0 175
Valiant 18.1 6 225.0 105
Duster 360 14.3 8 360.0 245
Merc 240D 24.4 4 146.7 62
Merc 230 22.8 4 140.8 95
Merc 280 19.2 NA 167.6 123
Merc 280C 17.8 6 167.6 123
Merc 450SE 16.4 8 275.8 180
Merc 450SL 17.3 8 275.8 180
Merc 450SLC 15.2 8 275.8 180
Cadillac Fleetwood 10.4 8 472.0 205
Lincoln Continental 10.4 8 460.0 215
Chrysler Imperial 14.7 8 440.0 230
Fiat 128 32.4 4 78.7 66
Honda Civic 30.4 4 75.7 52
Toyota Corolla 33.9 4 71.1 65