2016-08-12 15 views
1

私は追加の列、col2に基づいて値を持つCOL4を追加したいデータフレーム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でも同じ値を持ちます。

回避策を使用して、次のように結果を生成しました。

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" 

を助けそれとも我々は

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

matchを使用するか、あなたがdplyrからdense_rank()を試みることができるfactor

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

で行うことができるかもしれませ:

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のために働く必要があります。

関連する問題