根据索引列表更改dataframe列的值

时间:2016-06-06 00:00:59

标签: r

我有一个包含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)]中的错误:维数不正确

3 个答案:

答案 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