Замена частей значения (start_with) в фрейме данных значениями из другого фрейма данных в R - PullRequest
0 голосов
/ 23 января 2020

Я хочу заменить часть значения в df1 значением из df2. Если df1 $ col1 начинается с чисел в df2 $ col1, замените эти четыре числа (сохраняйте покой) на df2 $ col2. То же самое для df1 $ col2. Пример: для 16122567 замените на 5059, в результате чего получится 50592567. Пробовали разные виды start_with, loop, для (i in ..), mutate et c .. Anyone? (Я новичок в R).

df1  col1        col2
1    16122567    89992567
2    17236945    16126548
3    95781657    19995670
4    16126972    56972541 

df2  col1    col2    
1    1612    5059    
2    1723    5044    
3    8999    5094    
4    1999    9053

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вот один способ с dplyr. Мы можем создать новый столбец с первыми 4 символами col1, left_join с df2, replace NA с четырьмя символами col2.x. Наконец, мы используем substr для замены значений в указанной c позиции.

library(dplyr)

df3 <- df1 %>%
         mutate(col1 = substr(col1, 1, 4)) %>%
         left_join(df2 %>% mutate(col1 =  as.character(col1)), by = 'col1') %>%
         mutate(col2.y = ifelse(is.na(col2.y), substr(col2.x, 1, 4), col2.y), 
         col2.x = as.character(col2.x))

substr(df3$col2.x, 1, 4) <- df3$col2.y

df3
#  col1   col2.x col2.y
#1 1612 50592567   5059
#2 1723 50446548   5044
#3 9578 19995670   1999
#4 1612 50592541   5059
0 голосов
/ 23 января 2020

Вот еще один подход с использованием базы R. Мы можем создать функцию для проверки и манипулирования текстом, а затем применить эту функцию к любому столбцу, который мы хотим изменить.

# the data
df1 <- data.frame(col1 = c(16122567, 17236945, 95781657, 16126972),
                  col2 = c(89992567, 16126548, 19995670, 56972541))

df2 <- data.frame(col1 = c(1612, 1723, 8999, 1999), 
                  col2 = c(5059, 5044, 5094, 9053))   

# a function to do the check and create the chimera strings
check_and_paste <- function(check1, check2, replacement) {
  res <- c()
  for (i in seq_along(check1)) {
    four_digits <- substr(check1[i], 1, 4)
    if (four_digits %in% check2) {
      res[i] <- paste(replacement[which(four_digits == check2)], 
                      substr(check1[i], 5, 8), 
                      sep = "")
    } else {
      res[i] <- check1[i]
    }
  }
  return(as.numeric(as.character(res))) # to return numbers
}

# apply to the first column
new_col1 <- check_and_paste(
  check1 = df1$col1,
  check2 = df2$col1,
  replacement = df2$col2
)

# and the second
new_col2 <- check_and_paste(
  check1 = df1$col2,
  check2 = df2$col1,
  replacement = df2$col2
)

# the new data frame
data.frame(new_col1, new_col2)
#  new_col1 new_col2
#1 50592567 50942567
#2 50446945 50596548
#3 95781657 90535670
#4 50596972 56972541
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...