Как применить функцию ifelse ко всем ячейкам во фрейме данных? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь применить оператор ifelse ко всем ячейкам в моем фрейме данных. Я почти уверен, что обдумываю это, но был бы признателен за некоторую помощь / руководство!

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

           dwarf shrub equisetum  forb fungi graminoid lichen  moss shrub-forb tall shrub tree
site1            33.25         0 21.25   1.0     35.25   3.25 60.00       0.00      34.25 0.25
site2            30.25         0 15.00   0.0     25.75   7.50 62.25       1.50      26.75    0
site3            50.00         0 10.00   0.5     23.50   3.25 65.00       6.75      18.50    0
site4            46.00         0  7.75   0.0     32.75   2.25 33.75       4.50      11.25 0.75
site5            28.00         0 11.00   0.0     40.00   6.00 30.00       0.00      38.00    0
site6            40.25         0 10.50   0.0      5.75   6.25  7.25       3.25       8.75 1.25

Я пытаюсь округлить числа до ближайшего целого числа, чтобы функция round () используется, когда значение больше 1, а функция floor () используется, когда значение меньше 1.

Вот код, который я написал, чтобы попытаться сделать это:

new.df <- if(old.df > 1){
                  round(old.df, digits = 0)} else{
                  ceiling(old.df)
}

Я также пробовал без функции потолка:

new.df <- if(old.df > 1){
                  round(old.df, digits = 0)} else{
                  old.df == 1
}

Мне не удалось применить вторую половину утверждения (потолок ()). Я получаю эту ошибку:

Warning message:
In if (old.df > 1) { :
  the condition has length > 1 and only the first element will be used

Любая помощь будет высоко ценится, спасибо!

1 Ответ

1 голос
/ 24 марта 2020

Вы упомянули ifelse, я думаю, что достаточно просто применить это к каждому столбцу, используя lapply. (Я добавлю проверку isnum, если в данных есть нечисловые столбцы c, не стесняйтесь игнорировать их, если ваши данные всегда numeric.)

isnum <- sapply(dat, is.numeric)
dat[isnum] <- lapply(dat[isnum], function(x) ifelse(x > 1, ceiling(x), round(x, 0)))
dat
#   dwarf_shrub equisetum forb fungi graminoid lichen moss shrub_forb tall shrub tree
# 1       site1        34    0    22         1     36    4         60    0    35    0
# 2       site2        31    0    15         0     26    8         63    2    27    0
# 3       site3        50    0    10         0     24    4         65    7    19    0
# 4       site4        46    0     8         0     33    3         34    5    12    1
# 5       site5        28    0    11         0     40    6         30    0    38    0
# 6       site6        41    0    11         0      6    7          8    4     9    2

Данные : Мне пришлось переименовать некоторые из столбцов, поскольку некоторые из имен ваших столбцов не так легко прочитать (пробелы, дефисы).

dat <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
           dwarf_shrub equisetum  forb fungi graminoid lichen  moss shrub_forb tall shrub tree
site1            33.25         0 21.25   1.0     35.25   3.25 60.00       0.00      34.25 0.25
site2            30.25         0 15.00   0.0     25.75   7.50 62.25       1.50      26.75    0
site3            50.00         0 10.00   0.5     23.50   3.25 65.00       6.75      18.50    0
site4            46.00         0  7.75   0.0     32.75   2.25 33.75       4.50      11.25 0.75
site5            28.00         0 11.00   0.0     40.00   6.00 30.00       0.00      38.00    0
site6            40.25         0 10.50   0.0      5.75   6.25  7.25       3.25       8.75 1.25")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...