R: сравните каждое значение в списке с другим значением

#r

#r

Вопрос:

Я новичок в R. У меня есть матрица, и я хочу знать, является ли каждое значение определенного столбца больше 0,05. Как мне это сделать? И почему вторая строка кода не работает? 9.65830710944783e-05 меньше 0,05, но логическое значение для этого равно True

 > head(combine[,"rollingUSGG5Y_significance"], 30)
 [1] NA                     NA                     NA                     NA                    
 [5] NA                     NA                     NA                     NA                    
 [9] NA                     "0.000340501400361469" NA                     NA                    
[13] NA                     NA                     "0.0180102687712968"   NA                    
[17] NA                     NA                     NA                     "0.00392196741941212" 
[21] NA                     NA                     NA                     NA                    
[25] "9.65830710944783e-05" NA                     NA                     NA                    
[29] NA                     "3.23767237214935e-07"
> head(combine[,"rollingUSGG5Y_significance"] > 0.05,30)
 [1]    NA    NA    NA    NA    NA    NA    NA    NA    NA FALSE    NA    NA    NA    NA FALSE    NA    NA    NA
[19]    NA FALSE    NA    NA    NA    NA  TRUE    NA    NA    NA    NA  TRUE
  

Комментарии:

1. сначала убедитесь, что они числовые: head(as.numeric(combine[,"rollingUSGG5Y_significance"] )> 0.05,30)

2. Это работает. Спасибо!

Ответ №1:

Символьный столбец будет оцениваться TRUE / FALSE иначе по сравнению с числовым столбцом при сравнении с числовым значением. Как отметил @Onyambu в комментариях, убедитесь, что вы оцениваете числа как числа.

Вот демонстрация того, как вы будете получать разные логические значения в каждом случае:

 set.seed(123)
n <- 10
a <- c(rnorm(n), NA_integer_)
b <- c(as.character(rnorm(n)), NA_character_)

df <- data.frame(a, b, stringsAsFactors = FALSE)

df
             a                  b
1  -0.56047565   1.22408179743946
2  -0.23017749  0.359813827057364
3   1.55870831  0.400771450594052
4   0.07050839   0.11068271594512
5   0.12928774 -0.555841134754075
6   1.71506499   1.78691313680308
7   0.46091621  0.497850478229239
8  -1.26506123  -1.96661715662964
9  -0.68685285  0.701355901563686
10 -0.44566197 -0.472791407727934
11          NA               <NA>
  

Вы можете видеть это a и b иметь разные типы:

 sapply(df, class)
          a           b 
  "numeric" "character" 
  

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

 df[, "a"] > .05
# FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE    NA

df[, "b"] > .05
# TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE    NA
  

Добавлено объяснение от @Onyambu в комментариях:

Часто число неявно приводится к символу. например, 3==»3″ должно возвращать TRUE, а 3> «2.5» — TRUE, но 3e-1> «3» должно возвращать FALSE, но оно возвращает TRUE из-за символа, считываемого как 3e-1, а не как 0.3.

Комментарии:

1. Это хороший ответ!! Также, вероятно, вам следует добавить, что часто число неявно приводится к символу. например 3=="3" , должно быть возвращено TRUE, а 3> «2.5» — TRUE, но 3e-1>»3″ должно возвращать FALSE, но оно возвращает TRUE из-за символа, считываемого как 3e-1, а не как 0.3.