В чем разница между этими 2 версиями или R?

#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 это объясняет это специфическое использование, и мне это кажется разумным объяснением.