Замена вхождения числа в несколько столбцов кадра данных с другим значением в R

ETA: точка ниже, кстати, не должна проходить через весь набор векторов столбцов, на всякий случай это было предлагаемое решение (просто сделайте то, что известно работать один раз за раз).


Существует множество примеров замены значений в одном векторе кадра данных в R с некоторым другим значением.

А также как заменить все значения NA на что-то еще:

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

Пример:

data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep(1:9), var2 = rep(3:5, each = 3))

data
  name var1 var2
1    a    1    3
2    a    2    3
3    a    3    3
4    b    4    4
5    b    5    4
6    b    6    4
7    c    7    5
8    c    8    5
9    c    9    5

И скажите, что все значения 4 в var1 и var2 равны 10.

Я уверен, что это элементарно, и я просто не думаю об этом правильно. Я пробовал такие вещи, как:

data[data[, 2:3] == 4, ]

Это не работает, но если я делаю то же самое с data[, 2] вместо data[, 2:3], все работает нормально. Кажется, что логический тест (например, is.na()) работает с несколькими строками/столбцами, но эти численные сравнения не так хорошо воспроизводятся?

Спасибо за любые предложения!

Ответ 1

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

data[ is.na( data ) ] <- 10

вы также можете заменить все 4s на 10 секунд.

data[ data == 4 ] <- 10

По крайней мере, я думаю, что вы после?

и пусть вы хотите игнорировать первую строку (так как все буквы)

# identify which columns contain the values you might want to replace
data[ , 2:3 ]

# subset it with extended bracketing..
data[ , 2:3 ][ data[ , 2:3 ] == 4 ]
# ..those were the values you're going to replace

# now overwrite 'em with tens
data[ , 2:3 ][ data[ , 2:3 ] == 4 ] <- 10

# look at the final data
data

Ответ 2

В основном data[, 2:3]==4 предоставил вам индекс data[,2:3] вместо data:

R > data[, 2:3] ==4
       var1  var2
 [1,] FALSE FALSE
 [2,] FALSE FALSE
 [3,] FALSE FALSE
 [4,]  TRUE  TRUE
 [5,] FALSE  TRUE
 [6,] FALSE  TRUE
 [7,] FALSE FALSE
 [8,] FALSE FALSE
 [9,] FALSE FALSE

Итак, вы можете попробовать следующее:

R > data[,2:3][data[, 2:3] ==4]
[1] 4 4 4 4

Ответ 3

Чтобы дать другой ответ, я подумал, что напишу вектор-математический подход:

Вы можете создать матрицу преобразования (на самом деле это кадр данных, но будет работать одинаково), используя векторизованное выражение ifelse и умножьте матрицу преобразования и ваши исходные данные следующим образом:

df.Rep <- function(.data_Frame, .search_Columns, .search_Value, .sub_Value){
   .data_Frame[, .search_Columns] <- ifelse(.data_Frame[, .search_Columns]==.search_Value,.sub_Value/.search_Value,1) * .data_Frame[, .search_Columns]
    return(.data_Frame)
}

Чтобы заменить все значения 4 на 10 в "данных данных" в столбцах с 2 по 3, вы должны использовать такую ​​функцию:

# Either of these will work.  I'm just showing options.
df.Rep(data, 2:3, 4, 10)
df.Rep(data, c("var1","var2"), 4, 10)

#   name var1 var2
# 1    a    1    3
# 2    a    2    3
# 3    a    3    3
# 4    b   10   10
# 5    b    5   10
# 6    b    6   10
# 7    c    7    5
# 8    c    8    5
# 9    c    9    5

Ответ 4

Просто для непрерывности

    data[,2:3][ data[,2:3] == 4 ] <- 10

Но это выглядит уродливо, так что сделайте это за 2 шага.