2016-08-12 2 views
1

У меня есть dataframeКак назначить значение для столбца на основе другого значения столбца в R?

df <- data.frame(structure(list(col1= c("A", "B", "C", "D", "A"), 
     col2= c(1, 1, 1, 1, 5), col3 = c(2L, 1L, 1L, 1L, 1L)), 
     .Names = c("col1", "col2", "col3"), 
     row.names = c(NA, -5L), class = "data.frame")) 

Я хочу добавить еще один столбец, COL4 со значениями на основе col2. Строки, имеющие одинаковое значение в col2, будут иметь одинаковое значение в col4.

Работая вокруг, я сгенерировал результат следующим образом.

x <- df[!duplicated(df$col2),] 
x$col4 <- paste("newValue", seq(1:nrow(x)), sep="_") 

df_new <- merge(x, df, by ="col2") 

df_new <- df_new[,c("col2","col4", "col1.y", "col3.y")] 

Это работает, но я думал, что есть лучший способ сделать это. Спасибо!

ответ

1

Может быть, это помогает

df$col4 <- paste0("newValue_", cumsum(!duplicated(df$col2))) 
df$col4 
#[1] "newValue_1" "newValue_1" "newValue_1" "newValue_1" "newValue_2" 

Или мы используем match

with(df, paste0("newValue_", match(col2, unique(col2)))) 
#[1] "newValue_1" "newValue_1" "newValue_1" "newValue_1" "newValue_2" 

Или это может быть сделано с factor

with(df, paste0("newValue_", as.integer(factor(col2, levels = unique(col2))))) 
2

Вы можете попробовать dense_rank() из dplyr:

library(dplyr) 
df %>% 
    mutate(col4 = dense_rank(col2), 
      col4_new = paste0("newValue_", col4)) 

Это дает что-то очень похожее на ваш желаемый результат в вашем вопросе, но я не уверен точно, что вы ищете. Если вы хотите, чтобы убедиться, что все строки с одинаковыми значениями в col2 получить такое же значение в col4 то просто arrangedf, а затем использовать dense_rank:

df %>% 
    arrange(col2) %>% 
    mutate(col4 = dense_rank(col2), 
      col4_new = paste0("newValue_", col4)) 

Это должно работать для data.frame произвольного размера.

Смежные вопросы