我有两个数据框,如下所示。如果数据帧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))
答案 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
在向量中的所有值上检验该假设,并为每个值返回向量TRUE
或FALSE
在向量中。将其与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