Измените значение столбца a, если столбец b содержит условную строку - PullRequest
0 голосов
/ 07 июня 2018

Эта проблема доставляет мне много хлопот, хотя и должна решаться каждый день.У меня есть набор данных с идентификаторами столбцов и плакатом.Я хочу изменить значение плаката, если значение идентификатора содержит определенную строку.См. Данные ниже:

test_df

id                   poster
143537222999_2054    Kevin
143115551234_2049    Dave
14334_5334           Eric
1456322_4334         Mandy
143115551234_445633  Patrick
143115551234_4321    Lars
143537222999_56743   Iris

Я хотел бы получить

test_df

id                   poster
143537222999_2054    User
143115551234_2049    User
14334_5334           Eric
1456322_4334         Mandy
143115551234_445633  User
143115551234_4321    User
143537222999_56743   User

Оба столбца являются символами.Я хотел бы изменить значение плаката на «Пользователь», если значение идентификатора содержит «143537222999», ИЛИ «143115551234».Я пробовал следующие коды:

Соответствие в / который

test_df <- within(test_df, poster[match('143115551234', test_df$id) | match('143537222999', test_df$id)] <- 'User')

Этот код не дал мне ошибок, но он не изменил ни одно из значений впостерная колонна.Когда я заменяю, для которого я получаю ошибку:

test_df <- which(test_df, poster[match('143115551234', test_df$id) | match('143537222999', test_df$id)] <- 'User')
Error in which(test_df, poster[match("143115551234", test_df$id) |  : 
  argument to 'which' is not logical

Соответствует другому варианту

test_df <- test_df[match(id, test_df, "143115551234") | match(id, test_df, "143537222999"), test_df$poster] <- 'User'

Этот код дает мне ошибку:

Error in `[<-.data.frame`(`*tmp*`, match(id, test_df, "143115551234") |  : 
  missing values are not allowed in subscripted assignments of data frames
In addition: Warning messages:
1: In match(id, test_df, "143115551234") :
  NAs introduced by coercion to integer range
2: In match(id, test_df, "143537222999") :
  NAs introduced by coercion to integer range

После поиска этой ошибки я обнаружил, что целые числа в R 32-битные, а максимальное значение целого числа - 2147483647. Я не уверен, почему я получаю эту ошибкупотому что R утверждает, что мой столбец является символом.

> lapply(test_df, class)

$poster
[1] "character"

$id
[1] "character"

Grepl

test_df[grepl("143115551234", id | "143537222999", id), poster := "User"]

Этот код вызывает ошибку:

Error in `:=`(poster, "User") : could not find function ":="

Я не уверен, что лучший способ исправить эту ошибку, я пробовал несколько вариантов и продолжаю сталкиваться с различными ошибками.

Я попробовал несколько ответов из нескольких вопросов , которые были заданы до того, как здесь, но я все еще могу 'исправить некоторые ошибки.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете попробовать это, используя grepl.

df[grepl('143115551234|143537222999', df$id),"poster"] <- "User"

Таким образом, все истинное значение, приведенное выше в столбце плаката, заменяется на «Пользователь»

> df[grepl('143115551234|143537222999', df$id),"poster"] <- "User"
> df
                   id poster
1   143537222999_2054   User
2   143115551234_2049   User
3          14334_5334   Eric
4        1456322_4334  Mandy
5 143115551234_445633   User
6   143115551234_4321   User
7  143537222999_56743   User
0 голосов
/ 07 июня 2018

Использование grepl с ifelse:

df$poster <- ifelse(grepl("143537222999|143115551234", df$id), "User", df$poster)

enter image description here

Демо

...