Замена всех отрицательных значений в зависимости от атрибутов переменной независимо от типа - PullRequest
0 голосов
/ 31 августа 2018

У меня очень большой смешанный набор данных (символьные переменные, числовые переменные, факторы), в котором отрицательные значения часто представляют пропущенные значения, см. Scales, но не всегда, см. Profit:

     Country Ccode  Year Profit Scale    ID Happiness_d Power_d  ID_d
  <chr>   <fcr> <dbl>     <dbl> <labelled>    <dbl>    <dbl>   <dbl>  <dbl>
1 France  FR     2000      1000  NA        1      40000. 160000.  1.67
2 France  FR     2001     -1200   1        1      80000. 320000.  1.67
3 France  FR     2000      1400   0        2      40000. 160000.  1.67
4 France  FR     2001      1600   3        2      80000. 320000.  1.67
5 UK      UK     2000     -1000  -9        3      40000. 160000.  1.67
6 UK      UK     2001      1000   2        3      80000. 320000.  1.67
7 UK      UK     2000      1000   4        4      40000. 160000.  1.67
8 UK      UK     2001      1000   0        4      80000. 320000.  1.67

Я хотел заменить все отрицательные значения на NA, используя:

df[df< 0] <- NA

Проблема заключается в том, что, хотя он предназначен для удаления отрицательных значений, представляющих NA, например, в Scale, в примере набора данных он также удалит отрицательные числа в Profit, которые, очевидно, не являются NA.

В результате я хотел бы сделать результат зависящим от диапазона переменной. Структура переменной Scale выглядит следующим образом:

Class 'labelled'  atomic [1:135894] NA NA 2 NA NA NA NA NA NA NA ...
  ..- attr(*, "label")= chr "Do You Use Technology Licensed From A Foreign-Owned Company?"
  ..- attr(*, "format.stata")= chr "%24.0g"
  ..- attr(*, "labels")= Named num [1:3] -9 1 2
  .. ..- attr(*, "names")= chr [1:3] "Don't Know (Spontaneous)" "Yes" "No"
> names(New_Comprehensive_June_25_2018$e6)

Я выяснил, что с haven библиотекой ссылка вы можете получить уровни факторов из;

   ..- attr(*, "labels")= Named num [1:3] -9 1 2

с get_values ​​().

get_values(df$Scale)
[1] -9 1 2

Возможно ли, чтобы решение устраняло только эти отрицательные факторы вместо других отрицательных значений?

..- attr(*, "labels")= Named num [1:3] -9 1 2

Для ясности, желаемый результат будет:

  Country Ccode  Year Profit Scale    ID Happiness_d Power_d  ID_d
  <chr>   <fcr> <dbl>     <dbl> <dbl>    <dbl>    <dbl>   <dbl>  <dbl>
1 France  FR     2000      1000  NA        1      40000. 160000.  1.67
2 France  FR     2001     -1200   1        1      80000. 320000.  1.67
3 France  FR     2000      1400   0        2      40000. 160000.  1.67
4 France  FR     2001      1600   3        2      80000. 320000.  1.67
5 UK      UK     2000     -1000  **NA**    3      40000. 160000.  1.67
6 UK      UK     2001      1000   2        3      80000. 320000.  1.67
7 UK      UK     2000      1000   4        4      40000. 160000.  1.67
8 UK      UK     2001      1000   0        4      80000. 320000.  1.67

dput пример (обратите внимание, что varable Scale на самом деле не существует:

h7a = structure(c(1, -9, 2, 3, 1, 3, -9, 2, 3, 1, 2, 1, 3, 
    3, 2, 2, 1, 2, 2, 1, 2, -9, 1, 4, 3, 3, 1, 1, 1, 1, 3, 4, 
    3, 1, 2, 2, 1, 2, 1, NA, 2, 1, 2, 4, 3, 1, 3, 4, 4, 3, 2, 
    4, 1, 1, 2, 3, 2, 2, 2, 2, 1, 2, 1, 3, 4, 3, 1, 3, 1, 2, 
    3, 3, 3, 1, 1, 4, -9, 4, 3, 1, 2, 3, 1, -9, 1, 4, 1, 3, 1, 
    -9, 1, 1, 1, 1, 2, 3, 1, 3, 1, 2, 1, 2, 3, 4, 3, 3, 2, 4, 
    3, 3, 1, -9, 1, -7, 3, 1, 1, 2, 1, 2, -7, 2, 3, 1, 3, -7, 
    3, 4, 3, 2, 3, NA, 3, 3, 3, 1, 1, 2, 2, -9, 3, 1, 1, 2, 1, 
    1, -9, -9, -9, 2, -9, 1, 2, 3, 2, 3, 3, 3, 3, 1, 2, -9, 4, 
    3, 3, 1, 2, 2, 4, 4, 4, 3, 2, 1, 2, 2, 2, 2, 2, 3, 2, 2, 
    -9, 4, 4, 4, 2, 1, -7, 2, 2, 1, 1, 2, 1, 2, 2, 4, 2, 3, -7, 
    3, 3, 3, 4, 2, 4, 2, NA, 1, 3, 1, 2, 3, 4, 3, -9, 3, 3, 4, 
    3, 2, 4, 1, 3, 1, 3, 4, 3, 1, 3, 3, 3, NA, 1, 3, 3, -7, 1, 
    1, 3, 2, 1, 4), label = "The Court System Is Fair, Impartial And Uncorrupted", format.stata = "%24.0g", class = "labelled", labels = structure(c(NA, 
    NA, 1, 2, 3, 4), .Names = c("Don't Know (Spontaneous)", "Does Not Apply", 
    "Strongly disagree", "Tend to disagree", "Tend to agree", 
    "Strongly agree"))),

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Решение Base-R:

# Find negative value from 3rd column onwards, replace it with NA 
# and bind with Country,Ccode and Profit columns. 
cbind(df[,c(1,2,4)],do.call(cbind, lapply(df[,-c(1,2,4)], function(x) ifelse(x<0,NA,x))))

Выход:

     Country Ccode Profit Year Scale ID Happiness_d Power_d ID_d
  1  France    FR   1000 2000    NA  1       40000  160000 1.67
  2  France    FR  -1200 2001     1  1       80000  320000 1.67
  3  France    FR   1400 2000     0  2       40000  160000 1.67
  4  France    FR   1600 2001     3  2       80000  320000 1.67
  5      UK    UK  -1000 2000    NA  3       40000  160000 1.67
  6      UK    UK   1000 2001     2  3       80000  320000 1.67
  7      UK    UK   1000 2000     4  4       40000  160000 1.67
  8      UK    UK   1000 2001     0  4       80000  320000 1.67
0 голосов
/ 31 августа 2018

Вот простой пример, который вы можете применить к своему набору данных.

# example data
df = data.frame(a = c("A","A","B"),
                x = c(1,2,3),
                y = c(NA,3,-7),
                z = c(200,300,-400))

library(dplyr)

df %>% mutate_if(is.numeric, ~ifelse(between(min(., na.rm = T), -9, -1) & .<0, NA, .))

#   a x  y    z
# 1 A 1 NA  200
# 2 A 2  3  300
# 3 B 3 NA -400

Вы можете обновить (mutate) столбец, только если этот столбец является числовым и минимальное значение этого столбца находится в диапазоне от -9 до -1. И обновление должно заменить отрицательные значения на NA.

Предполагается, что у вас есть только целочисленные значения. Если нет, вы можете использовать between(..., -9, 0).

...