将2个变量重新编码为一行

时间:2015-07-08 23:08:58

标签: r dplyr

说我有一个类似DF的东西:

close()
只有它有一个很长的没有。的行。我想根据a&的同时值创建一个列。 b,例如

df=data.frame(a=c(0,0,1,1),b=c(0,1,0,1))

我认为这可以使用内部连接完成,使用sqldf或者dplyr;是否有更快的方式,有或没有图书馆?

提前致谢,p

3 个答案:

答案 0 :(得分:2)

你可以这样做:

library(dplyr)
df %>% mutate(newcol = paste0(a, b))

取决于您希望如何标记新列。

如果你有一个所需值的向量,那么我们称之为查找:

lookup <- 10:100
df %>% mutate(newcol = lookup[as.factor(paste0(a, b))])

答案 1 :(得分:1)

认为你的意思是你有一个dictionary列的其他数据框(比如名为c),你查找(a,b) )在字典中从那里抓住c

df=data.frame(a=c(0,0,1,1),b=c(0,1,0,1))
dictionary <- df
dictionary$c <- 10:13
dictionary <- dictionary[sample(4), ] # shuffle it just to prove it works

在这种情况下你可以做到

merge(df, dictionary, merge=c('a', 'b'), all.x=T)

这将抓取c中匹配的dictionary列,并将其加入df。如果all.x中没有匹配(a,b),则NA会在其中放置dictionary

如果速度成为问题,您可以尝试data.table

library(data.table)
setDT(df)         # convert to data.table
setDT(dictionary) # convert to data.table
# set key
setkey(df,a,b)
setkey(dictionary,a,b)
# merge
dictionary[df] # will be `df` with the `c` column added, `NA` if no match

答案 2 :(得分:0)

超级作弊,仅适用于此示例,但是:

df$c <- 10 + df$b + df$a*2

否则,看看?merge