如何根据R中的另一个列值为列分配值?

时间:2016-08-12 09:52:00

标签: r merge data-munging

我有一个数据框

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")]

我想添加额外的列col4,其值基于col2。 col2中具有相同值的行在col4中也具有相同的值。

通过解决方法,我以下列方式生成结果。

:active

这有效,但我认为有更好的方法。 谢谢!

2 个答案:

答案 0 :(得分:2)

您可以尝试dense_rank()中的dplyr

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

这会在您的问题中提供与您想要的输出非常相似的内容,但我不确定您正在寻找什么。如果您想确保col2中具有相同值的所有行在col4中获得相同的值,那么只需arrange df,然后使用dense_rank

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

这适用于任意大小的data.frame

答案 1 :(得分: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)))))