在数据帧之间进行条件搜索,匹配,过滤和替换值

时间:2019-04-01 16:31:20

标签: r dataframe tidyverse

我有两个数据框,如下所示。如果数据帧2中的对应值低于(或高于)阈值(例如,<= 0.05),我想用NA替换数据帧1中的值(单元格)。我试图在下面举一个简单的例子。我在R方面的经验有限,但无法马上想到一个简单的解决方案。任何帮助/建议将不胜感激。

Range

let eventStore = EKEventStore() eventStore.requestAccess(to: .reminder) { (granted, error) in if let error = error { print(error) return } if granted { // go on managing reminders } }

input_1 = data.frame(col1 = c("ex1", "ex2", "ex3", "ex4"), col2 = c(1.2, 1.6, 1.9, 0.8), col3 = c(2.1, 0.8, 2.8, 1.9))

4 个答案:

答案 0 :(得分:1)

对于您的特定问题,我能想到的最短,最简单的解决方案是使用which()函数。解决方案是:

output[which(input_2$col2 > 0.05),2] <- NA
output[which(input_2$col3 > 0.05),3] <- NA

which()函数在逻辑向量或数组中找到索引TRUE的值。通过逻辑上针对一个值设置一列(input_2$col2),R在向量中的所有值上检验该假设,并为每个值返回向量TRUEFALSE在向量中。将其与which()函数结合使用,并在向量或数据框中的列/行的子集中使用时,您将从适合您的逻辑测试的向量/列/行中获取值。这是在数据框中设置条件值的简单方法。

但是,如果每列只有一个阈值,则可以在通过管道连接到数据框的ifelse()函数中使用mutate()函数。这是一个示例:

threshold <- 0.5
df <- input_1 %>% 
  mutate(new_col = ifelse(col2 > threshold, NA, col2))

希望有帮助。如果您对R感到好奇,请在此处阅读Hadley Wickham的书: https://r4ds.had.co.nz/index.html

答案 1 :(得分:1)

仅使用基数为R的索引就可以用一行完成,如下所示。在此之前,建议您在stringsAsFactors = F函数内使用data.frame,这也是将来将数据读入R的好习惯。

input_1[-1][input_2[-1] > 0.05] = NA

它会更改input_1的位置,但是如果您想保留原样,则可以事先创建另一个对象。 [-1]不包括第一列。

答案 2 :(得分:0)

Base R方法,效率不高

dt <- merge(input_1, input_2, by = 'col1', suffixes = c('_1', '_2'))
dt$col2_1[dt$col2_2 <= 0.05] <- NA
dt$col3_1[dt$col3_2 <= 0.05] <- NA

dt$col2_2 <- NULL
dt$col3_2 <- NULL

  col1 col2_1 col3_1
1  ex1    1.2     NA
2  ex2    1.6    0.8
3  ex3     NA    2.8
4  ex4     NA    1.9

答案 3 :(得分:0)

output = input_1
output[input_2[,"col2"] > 0.05 , "col2"] = NA
output[input_2[,"col3"] > 0.05 , "col3"] = NA

> output
  col1 col2 col3
1  ex1   NA  2.1
2  ex2   NA   NA
3  ex3  1.9   NA
4  ex4  0.8   NA