Замена значений столбца в кадре данных R

#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() .