我想根据匹配变量(如果有)和其他条件(如果没有)在数据框中添加一个新列.当我使用match函数时,我意识到数据框之间的不一致(字面上把它搞砸了-我知道,索引)和主数据框有重复的观测,而第二个数据框中的观测是唯一的.

下面是模拟的数据帧:

df = data.frame(kin1 = c("392", "392", "694", "615", "392", NA, "782"),
                anon = c("D1","D2","D3","D4", "D5","D6", "D7"))

df2 = data.frame(id = c("424","392", "615","429"),
                 rep = c("H1", "H2", "H3", "H4"))

我想做的是为第一个数据框创建第三列,并满足以下条件:

    1. 如果dfkin1列中的变量与 变量id列,则df中的新列应该 取df2的第rep列中的值.
    1. 如果dfkin1列中的变量是NA,则df中的新列也应该是NA.
    1. 最后,如果两个条件都不满足,则df中的新列应该 取同一数据帧的anon列中的值.

所以我想要的输出应该是:

desired.df
  kin1 anon new_id
1  392   D1     H2
2  392   D2     H2
3  694   D3     D3
4  615   D4     H3
5  392   D5     H2
6 <NA>   D6   <NA>
7  782   D7     D7

我已经try 了嵌套的for循环,它似乎很有效,但我的实际数据是海量的,所以我真的需要更智能、更快的方法来解决我的问题.

先谢谢你.

推荐答案

dplyr and tidyr

本例使用嵌套的ifelse.当我正要回答的时候,我不得不离开了一秒钟,然后回来,注意到@r2evans个回答.

library(dplyr)
library(tidyr)

df1 <- data.frame(kin1 = c("392", "392", "694", "615", "392", NA, "782"),
                anon = c("D1","D2","D3","D4", "D5","D6", "D7"))

df2 <- data.frame(id = c("424","392", "615","429"),
                 rep = c("H1", "H2", "H3", "H4"))

merge(df1,df2,by.x='kin1',by.y='id',sort=FALSE,incomparables='anon',all=TRUE) %>%
  mutate(new_id=ifelse(!is.na(rep),rep,ifelse(is.na(kin1),NA,anon))) %>%
  drop_na(anon) %>%
  select(,-3)
#  kin1 anon new_id
#1  392   D1     H2
#2  392   D2     H2
#3  392   D5     H2
#4  615   D4     H3
#5  694   D3     D3
#6 <NA>   D6   <NA>
#7  782   D7     D7

R相关问答推荐

使用scale_x_continuous复制ggplot 2中的离散x轴

如何从其他前面列中减go 特定列的平均值?

以R为基数排列奇数个图

根据列表中项目的名称多次合并数据框和列表

计算R中的威布尔分布的EDF

RStudio中相关数据的分组箱形图

提取具有连续零值的行,如果它们前面有R中的有效值

在R中使用download. file().奇怪的URL?

使用较长的查询提取具有部分匹配的列表中的较短目标,

将. xlsx内容显示为HTML表

用两种 colored颜色 填充方框图

根据另一列中的值和条件查找新列的值

我如何使用循环来编写冗余的Rmarkdown脚本?

访问数据帧中未定义的列时出现R错误

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

排序R矩阵的行和列

roxygen2正在处理太多的文件

在shiny 表格中输入的文本在第一次后未更新

从字符串列中的向量中查找第一个匹配的单词

为什么在POSIXct-times的向量上循环会改变R中的类型?