#r
#r
Вопрос:
products <- data.frame(key=c("Kettles", "Fryers", "Toasters", "Irons"),
price=c(20, 90, 60, 80))
prod <- sample(products$key, 5, replace=T, prob=c(4, 1, 2, 3))
prod
str(prod)
amount <- products[prod,]$price
amount #problem in 4.03 not in 3.6.1, in 4.0.3 gives [1] NA NA NA NA NA
Комментарии:
1.
key
это просто имя столбца, а не ключ data.frame в смысле программирования базы данных код должен выдавать одинаковыеNA
значения в любой версии R. При извлечении rws из df первый индекс является либо вектором номеров строк, либо вектором имен строк,key
не является ни тем, ни другим.2. Правильно :
i <- sample(nrow(products), 5, replace=T, prob=c(4, 1, 2, 3)); products$price[i]
.
Ответ №1:
Самая большая разница между factor
и character
.
R3> str(products)
'data.frame': 4 obs. of 2 variables:
$ key : Factor w/ 4 levels "Fryers","Irons",..: 3 1 4 2
$ price: num 20 90 60 80
R4> str(products)
'data.frame': 4 obs. of 2 variables:
$ key : chr "Kettles" "Fryers" "Toasters" "Irons"
$ price: num 20 90 60 80
В R-3.6 и более ранних версиях поведение по умолчанию data.frame(..., stringsAsFactors=TRUE)
такое, в то время как давний запрос многих (но не всех пользователей) состоял в том, чтобы изменить это значение по умолчанию на stringsAsFactors=FALSE
в R-4 и более поздних версиях.
Вы можете имитировать поведение R4 в R3 с помощью:
R3> products[as.character(prod),]$price
[1] NA NA NA NA NA
или
R2> products <- data.frame(key=c("Kettles", "Fryers", "Toasters", "Irons"),
price=c(20, 90, 60, 80),
stringsAsFactors = FALSE)
R3> prod <- sample(products$key, 5, replace=T, prob=c(4, 1, 2, 3))
R3> prod
[1] "Fryers" "Fryers" "Kettles" "Toasters" "Irons"
R3> products[prod,]$price
[1] NA NA NA NA NA
Причина, по которой он возвращает не- NA
когда это a factor
, заключается в том, что внизу, prod
поскольку a factor
действительно просто integer
. Возврат к фрейму на factor
основе:
R3> products <- data.frame(key=c("Kettles", "Fryers", "Toasters", "Irons"),
price=c(20, 90, 60, 80))
R3> set.seed(42)
R3> prod <- sample(products$key, 5, replace=T, prob=c(4, 1, 2, 3))
R3> prod
[1] Fryers Fryers Kettles Toasters Irons
Levels: Fryers Irons Kettles Toasters
R3> as.integer(prod)
[1] 1 1 3 4 2
R3> products[prod,]$price
[1] 20 20 60 80 90
R3> products[as.integer(prod),]$price
[1] 20 20 60 80 90
Итак, R-3 на самом деле просто использует базовое целое число факторов. Хотя я не могу найти четкую маркировку в https://cran.r-project.org/doc/manuals/r-devel/NEWS.html это объясняет это специфическое использование, и мне это кажется разумным объяснением.