当前位置: 首页 > 知识库问答 >
问题:

根据多个条件将数据帧中的 NA 替换为第二个数据帧中的值

谭飞掣
2023-03-14

我有两个data.frames,每个都有数千行和几十列,都是通过合并几个csv文件创建的。data.frames正是我想要的。我还要补充一点,df1和df2有几列是共同的。唯一的问题是,在其中一个中,比如df1,对于某些列,有一些NAs(这是预期的/正常的)。好的一面是,我有NAs的相同列也出现在第二data.frame,比如df2,但没有NAs。我想做的是用df1同一列的值填充df2给定列中的NAs,其中每个值都是根据df1和df2之间其他列值的匹配选择的。

使用一些随机数据:

A<- format(seq(as.Date("2021/09/01"), by = "day", length.out = 26), format="%Y%m%d")
B<- format(seq(as.POSIXct("2021-1-1 15:00"), as.POSIXct("2021-1-02 16:00"), by = "hour"), format = "%H:%M")
C<- sample(1:100, 26, replace=FALSE)
D<- LETTERS
E<- paste(D, C)

df1<- cbind(A, B, C, D)
df2<- cbind(A, B, C, E)
df2[c(7:10, 13, 18:21), 3] <- NA #replace some of the values with NAs
df2<- df2[-c(2,5,11,17,23,26),] #delete some columns so df1 and df2 are of different size

我希望对于df2$C,当找到n a值时,对应的df2$A和df2$B值都与所有df1$A和df2$B匹配。当且仅当在df1中找到与df1$A和df1$B匹配的行时,df1$C的对应值被复制到df2$C NA值中。换句话说,对于上面的html" target="_blank">示例数据,如果df2$C中有一个n a值,则该特定行的相应日期和时间组合应该与df1中所有日期和时间的结果连接相匹配,当发现匹配时,df1$C的相应值将用于替换df2$C中的NA。

# as an instance, a case of my df2 where a NA occurs is
df2[17,3] 

#This should be replaced with the value from
df1[21,3] 

# because the time and date of 
df2[17,] 

A          B          C          E 
"20210921"    "11:00"         NA     "U 46" 

#is the same than 
df1[21,] 

A          B          C          D 
"20210921"    "11:00"       "46"        "U" 

我100%确定每个data.frame中的列A和B的连接在每个data.frame中给出了唯一的结果,因此df1$A和df1$B的连接将是唯一的,这同样适用于df2。同样,毫无疑问,df2$A和df2$B的串联将产生唯一一个与df1中A列和B列的串联相匹配的值。由于这个原因,我尝试将每个data.frames的A列和B列连接成一个新列,使用match(paste(...,...))在Base R中的elseif循环中,或者使用其他论坛中提出的dplyr库的其他解决方案,但是我找不到适合我的解决方案。我认为这类似于一个具有多个标准的Excel查找/vlookup函数,但是我不能在r中找到这个。

对如何进行有什么建议吗?谢谢。

共有2个答案

蔡理
2023-03-14

既然您已经提到了<code>dplyr</code>了;它为这项工作提供了工具。只需对要匹配的列执行<code>left_join

library(dplyr)
df1 <- as.data.frame(df1)
df2 <- as.data.frame(df2)

concatenate <- df2 %>%
    left_join(df1, by = c('A', 'B'), suffix = c('', '.y')) %>%
    mutate(C = coalesce(C, C.y)) %>%
    select(-c(C.y))
戚侯林
2023-03-14

您可以创建一个唯一的密钥来更新df2

unique_key1 <- paste(df1$A, df1$B)
unique_key2 <- paste(df2$A, df2$B)
inds <- is.na(df2$C)
df2$C[inds] <- df1$C[match(unique_key2[inds], unique_key1)]
df2

#         A     B  C    E
#1  20210901 15:00 74 A 74
#2  20210903 17:00 27 C 27
#3  20210904 18:00 60 D 60
#4  20210906 20:00  7  F 7
#5  20210907 21:00 96 G 96
#6  20210908 22:00 98 H 98
#7  20210909 23:00 38 I 38
#8  20210910 00:00 89 J 89
#9  20210912 02:00 69 L 69
#10 20210913 03:00 72 M 72
#11 20210914 04:00 76 N 76
#12 20210915 05:00 63 O 63
#13 20210916 06:00 13 P 13
#14 20210918 08:00 25 R 25
#15 20210919 09:00 92 S 92
#16 20210920 10:00 21 T 21
#17 20210921 11:00 79 U 79
#18 20210922 12:00 41 V 41
#19 20210924 14:00 97 X 97
#20 20210925 15:00 16 Y 16

数据

cbind创建矩阵时,使用数据。frame创建数据帧。

df1 <- data.frame(A, B, C, D)
df2 <- data.frame(A, B, C, E)
 类似资料:
  • 这是我的密码: 我想知道如何将df3绑定到单个数据帧中作为"NA"s? 我在r_blogger上找到了一篇关于将向量或长度不等的数据帧组合成一个数据帧的文章。http://www.r-bloggers.com/r-combining-vectors-or-data-frames-of-unequal-length-into-one-data-frame/ 但是我从数据中得到的数据框,其中一些是空的

  • 我有3个数据帧。第一数据帧(例如df1)具有多行和多列。第二和第三数据帧(例如df2和df3)仅具有来自DF1的一行和列的子集。df2和df3中的列名相同。所以我要做的是将df1中的每一行与df2和DF3中的单行进行比较。如果来自df1的单元格的值与df2的单元格内容匹配,则将df1中单元格的值替换为1;如果来自df1的单元格的值与df3匹配,则将df1中单元格的值替换为2;如果df2的单元格内容

  • 我有两个数据帧df1和df2。df1就像一个具有以下值的字典 df2具有以下值: 我想基于df1数据帧中的,将df2拆分为3个新的数据帧。 日期,TLRA_权益栏应位于数据框 预期产出: > 数据帧 消费者,非周期性数据帧 请让我知道如何有效地做。我想做的是连接列名,例如,然后根据列名的前半部分分割数据帧。 代码: 但这很复杂。需要更好的解决方案。

  • 我有两个实体:矩阵和数据帧。矩阵在所有单元格中都有数字。第二个数据帧在几个单元格中有NA。如何确保第一个矩阵的NA与后一个数据帧中的NA处于相同的精确位置。 我试着完成。case()和na。省略,但不幸的是,这将一起删除行。我尝试了一个for循环,它先按列迭代,然后按行迭代,检查单元格的位置是否为零,并返回位置,然后将该位置反馈到indp数据帧中-得到一些关于维度的错误: 贯穿我的逻辑。这将一次迭

  • 本文向大家介绍如何将NA替换为R数据帧中选定列的值?,包括了如何将NA替换为R数据帧中选定列的值?的使用技巧和注意事项,需要的朋友参考一下 在数据分析中,在数据框中查找某些NA值非常普遍,但如果包含NA值的列对分析无用,则所有NA值都不会产生问题。我们可以将所有NA值替换为0或将其他有用的列替换为其他值。 示例 请看以下数据帧- 将NA的连续列更改为零- 将NA的非连续列更改为零-

  • 我和Spark一起在Databricks上工作。编程语言是Scala。 我有两个数据帧: 主数据框:见截图:1 查找数据帧:参见屏幕截图3 我想: 查找主数据框中“年龄”=-1的所有行 我对如何做这件事伤了脑筋。我唯一想到的是将dataframe存储为DataRicks中的表,并使用SQL语句(SQL.Context.SQL…),结果非常复杂。 我想知道是否有更有效的方法。 编辑:添加可复制的示例