【问题标题】:create data frame based on unique values of two variables in R根据 R 中两个变量的唯一值创建数据框
【发布时间】:2016-11-06 01:46:29
【问题描述】:

我想根据来自另一个数据框的两个唯一值创建一个新数据框。

id <- c("A", "B", "B", "C")
st.name <- c("TX", "TX", "CA", "CA") 
type <- c(21, 26, 29, 24)
DF <- data.frame(id, st.name, type)
print(DF)

id st.name type  
A      TX   21  
B      TX   26  
B      CA   29  
C      CA   24  

我想根据 id 和 st.type 的唯一值创建一个新的数据框。结果如下所示:

new_id <- c("ATX", "ACA", "BTX", "BCA", "CTX", "CCA")
new_type <- c(21, NA, 26, 29, NA, 24)
DF2 <- data.frame(new_id, new_type)
print(DF2)

new_id new_type  
ATX       21  
ACA       NA  
BTX       26  
BCA       29  
CTX       NA  
CCA       24  

我在以前的项目中使用过dcast,但我不确定如何在此处合并该功能。

【问题讨论】:

  • 太棒了!谢谢@akrun

标签: r data.table dplyr uniqueidentifier reshape2


【解决方案1】:

我们可以使用来自tidyrcompleteunite 来做到这一点

library(tidyr)
complete(DF, id, st.name) %>% 
              unite(new_id, id, st.name, sep = '')

或者使用base R,我们可以通过expand.gridmergepaste得到预期的输出

transform(merge(expand.grid(lapply(DF[1:2], unique)),
             DF, all.x=TRUE), id = paste0(id, st.name))[-2]

data.table 选项和CJ(@Frank 在 cmets 中提到)

library(data.table)
setDT(DF)[CJ(id = id, st.name = st.name, unique=TRUE), on=.(id, st.name)]

【讨论】:

  • 美丽。小提示:unite 采用 sep 参数,因此 unite(new_id, id, st.name, sep='') 不会像 OP(更新)示例中那样给出分隔符。或者我们登陆的任何sep
  • 我猜你合并的 data.table 类似物类似于setDT(DF)[CJ(id = id, st.name = st.name, unique=TRUE), on=.(id, st.name)]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多