#r #dataframe #if-statement
#r #фрейм данных #если-заявление
Вопрос:
У меня есть фрейм данных с именем C0001 с 3671 наблюдением за 31 переменной. Я хочу применить проверку к каждому значению одной переменной с именем Y. Если значение этой переменной больше 30, замените ее на 30, в противном случае сохраните существующее значение. Я написал следующее в R, но это дает мне ошибку:
C0001 lt;- read.csv("C0001.csv") C0001$Ylt;- ifelse(C0001$Y gt; 30, 30, C0001$Y)
Ошибка в ans[НКО] : замена имеет нулевую длину Кроме того: Предупреждающее сообщение: В rep(нет, length.out = len): «x» равно НУЛЮ, поэтому результат будет НУЛЕВЫМ
Может ли кто-нибудь помочь мне с тем, какую ошибку я здесь совершаю? Есть ли какой-то другой способ выполнить ту же операцию без использования ifelse?
Спасибо
Комментарии:
1. Код выглядит нормально, поэтому я боюсь, что вам следует опубликовать некоторые данные, которые вы используете, или даже попытаться сделать минимальный воспроизводимый пример.
2. Проверьте класс столбца. Ваш код будет работать только в том случае, если класс числовой; если R считает, что столбец содержит символы, вам нужно будет либо преобразовать столбец в числовой, либо заключить 30-е в кавычки.
Ответ №1:
Попробуйте заменить read.csv()
на read_csv()
, а также проверьте свой основной рабочий каталог. read_csv()
Функция импортирует данные в R as a tibble
, а read.csv()
вместо этого импортирует обычный старый data frame
R. Ошибка указывает на то, что ваш ввод является либо нулевым, либо вектором длины 0: убедитесь, что индексы указаны правильно.
library(readr) C0001 lt;- read_csv("C:/Users/Desktop//C0001.csv") C0001 gt; C0001 # A tibble: 6 x 3 x y z lt;dblgt; lt;dblgt; lt;dblgt; 1 2 40 4 2 3 12 5 3 45 12 6 4 1 50 7 5 1 50 30 6 1 0 0 C0001$ylt;- ifelse(C0001$y gt; 30, 30, C0001$y) C0001 # A tibble: 6 x 3 x y z lt;dblgt; lt;dblgt; lt;dblgt; 1 2 30 4 2 3 12 5 3 45 12 6 4 1 30 7 5 1 30 30 6 1 0 0
Образец данных:
structure(list(x = c(2, 3, 45, 1, 1, 1), y = c(30, 12, 12, 30, 30, 0), z = c(4, 5, 6, 7, 30, 0)), row.names = c(NA, -6L), spec = structure(list( cols = list(x = structure(list(), class = c("collector_double", "collector")), y = structure(list(), class = c("collector_double", "collector")), z = structure(list(), class = c("collector_double", "collector"))), default = structure(list(), class = c("collector_guess", "collector")), skip = 1L), class = "col_spec"), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"))
Комментарии:
1. Почему это работает? Чем отличаются эти две функции? Откуда у вас эти данные? ОП не предоставил ничего подобного.
Ответ №2:
Используйте векторизацию следующим образом: C0001$Y lt;- C0001$Y[C0001$Y gt; 30]
Это работает вместо использования ifelse()
.