2016-08-12 203 views
1

我有一個數據幀如何分配基於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")) 

我想基於COL2值添加額外列,COL4。在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

來完成你可以從dplyr嘗試dense_rank()

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

這給你的問題很相似,所需輸出的東西,但我不知道你在尋找什麼。如果你想確保所有行具有相同值col2col4得到相同的值,則只是arrangedf然後用dense_rank

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

這應該爲任意大小的data.frame工作。

相關問題