根据行条件替换列值

时间:2021-01-11 18:22:58

标签: r if-statement conditional-statements

尝试根据数据框中的特定行条件用 NA 替换特定列值。示例数据集(测试)和我尝试过的代码如下。请注意,我的实际数据集要大得多,但我基本上需要用 NA 替换特定行(特定年份)中的特定列。在示例中,我尝试使用列索引为 2002 年的第 3:5 列插入 NA,但结果最终将第 3:5 列中的所有值替换为 NA。我确实想使用列索引而不是列名,因为我的实际数据中有很多列。

test <- data.frame(YEAR=c(2000,2001,2002,2003,2004,2000,2001,2002,2003,2004),
    zone=c('A','A','A','A','A','B','B','B','B','B'),
    value=c(5,9,2,5,7,1,8,4,2,1),
    value2=c(5,3,6,8,9,7,2,6,1,7),
    value3=c(1,5,7,3,9,1,8,2,9,8))

ifelse(test$YEAR==2002,test[,3:5]<-NA,test[])

2 个答案:

答案 0 :(得分:0)

@Test
fun test() = runBlockingTest {
  val pagingSource = MyPagingSource()
  val actual = pagingSource.load(LoadParams.Refresh(...))
  assertEquals(actual as? LoadResult.Page)?.data, listOf(...))
}

演练:

  • 碱基检出是 test[,3:5] <- lapply(test[,3:5], replace, test$YEAR == 2002, NA) test # YEAR zone value value2 value3 # 1 2000 A 5 5 1 # 2 2001 A 9 3 5 # 3 2002 A NA NA NA # 4 2003 A 5 8 3 # 5 2004 A 7 9 9 # 6 2000 B 1 7 1 # 7 2001 B 8 2 8 # 8 2002 B NA NA NA # 9 2003 B 2 1 9 # 10 2004 B 1 7 8 ,如果相应年份是 2002 年,则用 replace(x, test$YEAR == 2002, NA) 替换 x(待确定)的每个值;保留与 2002 年不对应的值;

  • NA 等价于

    lapply(test[,3:5], replace, test$YEAR == 2002, NA)

    并且正在对第 3-5 列中的每一列进行操作。对于每一列,它调用 lapply(test[,3:5], function(x) replace(x, test$YEAR == 2002, NA)) 函数,并返回结果。

  • replace 将返回一个列表。由于我们只想替换整个框架中的几列,因此我们执行 lapply,保留其余的列。

附注:

这也可以用 test[,3:5] <- 完成,看起来像:

ifelse

在这种定义非常明确的情况下,我倾向于使用 lapply(test[,3:5], function(x) ifelse(test$YEAR == 2002, NA, x)) 而不是 replace。为什么? (1) ifelse 更小更快。 (2) replace 在定义列时存在许多问题,例如 ifelse。 (3) class 当使用不正确的时候会默默地强制事物,它可以在没有警告或错误的情况下返回不同的类。虽然这可能是可取的,但它可能不是预期的,而且它是沉默。了解 ifelse(TRUE,Sys.time(),Sys.time()) 如何始终返回 ifelse 向量,这可能不是我们想要的。

无论如何,我从未见过 ifelse(c(T,F), c(pi,pi), c("hello","hello")) 的一个实例在调用中进行赋值是有意义的。也就是说,这些(对我来说)都没有意义:

character

答案 1 :(得分:0)

只是为了提供一个 tidyverse 解决方案:

test %>%
  mutate(across(contains("value"), ~if_else(YEAR == 2002, NA_real_, .)))

test %>%
  mutate(across(contains("value"), ~replace(., YEAR == 2002, NA)))

给予

#    YEAR zone value value2 value3
# 1  2000    A     5      5      1
# 2  2001    A     9      3      5
# 3  2002    A    NA     NA     NA
# 4  2003    A     5      8      3
# 5  2004    A     7      9      9
# 6  2000    B     1      7      1
# 7  2001    B     8      2      8
# 8  2002    B    NA     NA     NA
# 9  2003    B     2      1      9
# 10 2004    B     1      7      8
相关问题