Что, кажется, проблема заключается в том, что R делает некоторые хитрая вещь, когда вы назначаете функционировать возвращаемые значения. Например, что-то вроде
a <- c(1,3)
names(a) <- c("one", "three")
будет выглядеть очень странно на большинстве языков. Как назначить значение возвращаемому значению функции? Что действительно происходит, так это то, что определена функция с именем names<-
. В основном это возвращает преобразованную версию исходного объекта, которая затем может использоваться для замены значения, переданного этой функции.Так что это действительно выглядит как этот
.temp. <- `names<-`(a, c("one","three"))
a <- .temp.
переменной a
всегда полностью заменить, а не только его название.
Когда вы делаете что-то вроде
dfSet$a<-1
, что на самом деле происходит снова
.temp. <- "$<-"(dfSet, a, 1)
dfSet <- .temp.
Теперь все становится немного сложнее, когда вы пытаетесь сделать как []
и $
Подменю. Посмотрите на этот образец
#for subsetting
f <- function(x,v) {print("testing"); x==v}
x <- rep(0:1, length.out=nrow(dfSet))
dfSet$a <- 0
dfSet[f(x,1),]$a<-1
Обратите внимание, что «тестирование» печатается дважды. Что происходит на самом деле больше похож
.temp1. <- "$<-"(dfSet[f(x,1),], a, 1)
.temp2. <- "[<-"(dfSet, f(x,1), , .temp1.)
dfSet <- .temp2.
Так f(x,1)
вычисляется дважды. Это означает, что sample
будет оцениваться дважды.
Ошибка немного более очевидным является то, вы пытаетесь заменить переменную, которая не существует еще
dfSet[f(x,1),]$b<-1
# Warning message:
# In `[<-.data.frame`(`*tmp*`, f(x, 1), , value = list(ID = c(6L, :
# provided 4 variables to replace 3 variables
Здесь вы получите предупреждение, потому что .temp1.
переменная, как добавляется столбец и теперь имеет 4 колонки, но когда вы пытаетесь выполнить присвоение .temp2.
, теперь у вас есть проблема, что фрагмент кадра данных, который вы пытаетесь заменить, отличается от другого.
Идентификаторы заменяются, потому что оператор $<-
не просто возвращает новый столбец, он возвращает новый data.frame с обновленным столбцом до любого назначенного вами значения. Это означает, что строки, которые были обновлены, возвращаются вместе с идентификатором, который был там, когда произошло присвоение. Это сохраняется в переменной .temp1.
. Затем, когда вы выполняете назначение [<-
, вы выбираете новый набор строк для замены. Значения всех столбцов этих строк заменяются значениями от .temp1.
. Это означает, что вы будете переписывать идентификаторы для замещающих строк, и они могут отличаться, поэтому вы, вероятно, закончите с двумя или более копиями данного идентификатора.
Другим «работающим» будет «dfSet [dfSet $ ID% in% sample (dfSet [dfSet $ va1 == 'o1',] $ ID, 7, replace = FALSE)," va3 "] <- 1 '. Проблема, по-видимому, связана с оценкой как '[<-', так и' $ <- ', хотя я беспокоюсь о том, чтобы сделать ясный пример для ответа. – MrFlick
Я уверен, что ваша «работа вокруг» будет работать в каждом случае? Или, может быть, я должен знать о sth? Я собираюсь использовать ваше решение в массовом порядке (так как это однострочный), поэтому я хотел бы быть уверенным, что все в порядке. –
Да. Просто не комбинируйте '[]' и '$' с '<-', просто используйте один или другой с фреймом данных, и вы будете в безопасности. – MrFlick