请仔细查看示例数据集和所需结果,以了解此问题的目的。它不是我正在寻找的合并数据集解决方案。所以我在这里找不到答案:How to join (merge) data frames (inner, outer, left, right)?,也不是Use apply() to assign value to new column。它更确切地说是一种解决方案,用于在满足条件的情况下为新的colnames分配值。
这是一个可重复的插图,说明我想做什么:
x
这会产生以下示例数据集:
Email <- as.factor(c("1@1.com", "2@2.com", "3@3.com","4@4.com", "5@5.com"))
dataset1 <- data.frame(Email)
Code <- as.factor(c("Z001", "Z002", "Z003","Z004","Z005"))
Email <- as.factor(c("x@x.com", "2@2.com", "y@y.com", "1@1.com","z@z.com"))
dataset2 <- data.frame(Code, Email)
期望的输出:
Email
1 1@1.com
2 2@2.com
3 3@3.com
4 4@4.com
5 5@5.com
Code Email
1 Z001 x@x.com
2 Z002 2@2.com
3 Z003 y@y.com
4 Z004 1@1.com
5 Z005 z@z.com
所以我想写一个循环来检查dataset2的Email是否出现在dataset1中,如果这个条件为真,那么与dataset2中的Email相关联的Code被指定为datat1的新列名。 1作为该观察的细胞值。我完成这项工作的尝试以及所需输出的示例澄清了这个问题。
我自己尝试修复它(我知道这是错误的,但显示了我的意图):
Email Z002 Z004
1 1@1.com NA 1
2 2@2.com 1 NA
3 3@3.com NA NA
4 4@4.com NA NA
5 5@5.com NA NA
如果有人能帮助我,那会很棒。
答案 0 :(得分:1)
您的dataset2
位于&#34;长&#34;格式 - 将Code
列更改为多列,将其更改为&#34; wide&#34;格式。所以除了连接之外,我们还需要从long转换为宽{ - 3}}。结合这两个操作,我们这样做:
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 1@1.com NA 1
# 2 2@2.com 1 NA
# 3 3@3.com NA NA
# 4 4@4.com NA NA
# 5 5@5.com NA NA