说我有一个类似DF的东西:
close()
只有它有一个很长的没有。的行。我想根据a&的同时值创建一个列。 b,例如
df=data.frame(a=c(0,0,1,1),b=c(0,1,0,1))
我认为这可以使用内部连接完成,使用sqldf或者dplyr;是否有更快的方式,有或没有图书馆?
提前致谢,p
答案 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