2016-06-06 2 views
1

у меня есть кадр данных с 4-мя колонками:Изменение значений столбцов dataframe на основе списка индексов

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) 

Ошибка у [х, имена (х)]: неправильное число измерений

ответ

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 
+0

Спасибо Гопала! Как вы, возможно, заметили, я новичок в R и не знаю о глобальном задании! Но я думаю, что проблема с моим кодом, вероятно, связана с тем, что myData и myList имеют разные размеры. Еще раз спасибо. – Zrs

+0

Это не имеет значения. Не уверен. Если вы изменяете что-то внутри функции, то это недоступно вне этой функции. Таким образом, вам нужно либо «вернуть» то, что вы изменили из функции, либо сделать глобальное присвоение, чтобы оно было изменено в глобальной среде. Работает эфир. – Gopala

+0

Нет необходимости в глобальном присвоении, просто присвойте результаты «Map/mapply/sapply/lapply» обратно к исходному результату - 'myData [] <- Map (replace, myData, myList, NA)', как я прокомментировал ниже. Использование '<< -' обычно обескураживается, так как оно может давать непреднамеренные результаты в зависимости от того, где он заканчивается. – thelatemail

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 
+4

'myData [] <- Map (заменить, myData, myList, NA)' для краткости. – thelatemail

+0

Это безумно короткий ответ. @thelatemail – Psidom

+0

Это идентичная логика для вашего ответа, который, я думаю, является предпочтительным способом. 'replace' - это именно' x [index] <- значения; x' - поэтому он работает с одним и тем же кодом, просто предотвращая немного ввода :-) – thelatemail

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 
+1

Да, это то, что я только что сказал в комментарии ниже к моему ответу о глобальном задании. Вместо этого я мог бы переписать код таким образом. – Gopala

Смежные вопросы