2017-02-20 112 views
0

请仔细查看示例数据集和所需结果以查看此问题的目的。这不是我正在寻找的合并数据集解决方案。所以我可以在这里找到答案:How to join (merge) data frames (inner, outer, left, right)?,也没有在这里Use apply() to assign value to new column。它指的是一种解决方案,如果它们符合条件,则将值分配给新的名称。将单元格值分配给for循环中的新列

这里我愿做一个可重复的说明:

Email <- as.factor(c("[email protected]", "[email protected]", "[email protected]","[email protected]", "[email protected]")) 
dataset1 <- data.frame(Email) 


Code <- as.factor(c("Z001", "Z002", "Z003","Z004","Z005")) 
Email <- as.factor(c("[email protected]", "[email protected]", "[email protected]", "[email protected]","[email protected]")) 
dataset2 <- data.frame(Code, Email) 

这将导致在下面的示例数据集:

Email 
1 [email protected] 
2 [email protected] 
3 [email protected] 
4 [email protected] 
5 [email protected] 

    Code Email 
1 Z001 [email protected] 
2 Z002 [email protected] 
3 Z003 [email protected] 
4 Z004 [email protected] 
5 Z005 [email protected] 

所需的输出:

Email  Z002 Z004 
    1 [email protected] NA  1 
    2 [email protected] 1  NA 
    3 [email protected] NA  NA 
    4 [email protected] NA  NA 
    5 [email protected] NA  NA 

所以我想要编写一个循环来检查数据集1中是否出现数据集2的电子邮件,以及此条件是否正确与数据集2中的电子邮件相关联的代码被指定为数据集1的新列名称,其中该观察值的单元格值为1。我试图完成这个工作,并且期望输出的一个例子澄清了这个问题。

我自己试图修复它(我知道这是错的,但显示我的本意):

for(i in 1:nrow(dataset2)){ 
    if(dataset2$Email[i] %in% dataset1$Email) 
    dataset1[,dataset2$Code[i]] <- dataset2$Code[i] 
    dataset1[,dataset2$Code[i]][i] <- 1 
} 

将是巨大的,如果有人可以帮助我。

回答

1

您的dataset2处于“长”格式 - 将Code列更改为多列正在将其更改为“宽”格式。所以除了加入之外,我们还需要将长转换为宽 - this R-FAQ is a good read on that。结合这两个操作,我们这样做:

dat = merge(dataset1, dataset2, all.x = T) ## left join 
dat$value = 1 ## add the value we want in the result 
## convert long to wide 
result = reshape2::dcast(dat, Email ~ Code, value.var = "value", drop = T) 
result["NA"] = NULL ## remove the NA column that is added 
result 
#  Email Z002 Z004 
# 1 [email protected] NA 1 
# 2 [email protected] 1 NA 
# 3 [email protected] NA NA 
# 4 [email protected] NA NA 
# 5 [email protected] NA NA 
+0

非常感谢!我一直在寻找这个很长的时间,所以你的帮助非常感谢:) – Floris

相关问题