将单元格值分配给for循环中的新列

时间:2017-02-20 19:35:00

标签: r

请仔细查看示例数据集和所需结果,以了解此问题的目的。它不是我正在寻找的合并数据集解决方案。所以我在这里找不到答案: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

如果有人能帮助我,那会很棒。

1 个答案:

答案 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