【问题标题】:Recode 2 variables to one in one line [closed]将2个变量重新编码为一行[关闭]
【发布时间】:2015-09-27 02:45:27
【问题描述】:

假设我有一个像这样的 DF:

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

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

df
a  b  c
0  0  10
0  1  11
1  0  12
1  1  13

我认为这可以通过内部连接来完成,使用 sqldf 或 dplyr;有没有更快的方法,有或没有图书馆?

提前致谢,p

【问题讨论】:

  • 不确定您是如何确定c 列值的。
  • 这有关系吗?这就是为什么它被称为重新编码,您只需为您的项目确定所需的值
  • 是的,因为 df$c
  • 可能类似于library(digest) ; df$c <- apply(df, 1, digest)
  • 创建一个数据框,其中包含 a/b 值与 c 的预期值之间的映射。然后使用 merge 将两者连接起来。它可以让你随意命名 c

标签: r dplyr


【解决方案1】:

你可以这样做:

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

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

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

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

【讨论】:

  • 抱歉,paste0 不会创建我正在寻找的特定值 10..13,是吗?只合并 2 列?
  • 您是如何确定这些值的,从 10 开始并不断增加?
【解决方案2】:

超级作弊,只适用于这个例子但是:

df$c &lt;- 10 + df$b + df$a*2?

否则,看看 ?merge

【讨论】:

  • 是的,只适用于这个.....
【解决方案3】:

认为你的意思是你有一些其他数据框(比如称为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)

这将从dictionary 中获取匹配的c 列并将其插入df。如果dictionary 中没有匹配的 (a, b),all.x 将在那里放置一个NA

如果速度成为问题,您可以尝试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

【讨论】:

  • 感谢美国时间,我今天@9am 回来工作时找到了条目。是的,它是一个查找,是的,对于 2 个变量,而不仅仅是一个。让我现在测试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
相关资源
最近更新 更多