R语言case_when()中单双括号索引的输出差异原因探究
单/双括号索引在dplyr::case_when()中的差异原理解释
首先定义示例列表:
list1 <- list(a = as.data.frame(cbind(1:5,6:10)), b = "Hello", c = list(x = 10, y =20))
双括号索引的执行结果
代码:
case_when(list1[[1]][['V1']]==1~'a', list1[[1]][['V1']]==3~NA, list1[[1]][['V1']] %in% c(2:4)~'b')
输出:
[1] "a" "b" NA "b" NA
单括号索引的执行结果
代码:
case_when(list1[[1]]['V1']==1~'a', list1[[1]]['V1']==3~NA, list1[[1]]['V1'] %in% c(2:4)~'b')
输出:
[1] "a" NA NA NA NA
核心原理解释
1. 单/双括号索引的返回值类型差异
list1[[1]][['V1']]:双括号索引数据框的列,返回原子向量(此处为整数向量1:5)。list1[[1]]['V1']:单括号索引数据框的列,返回仅含一列的数据框,而非向量。
2. %in%函数对不同输入类型的处理逻辑
%in%基于match()函数实现匹配,但对数据框和向量的处理逻辑完全不同:
- 输入为向量时:
match()会逐个比对向量元素与目标集合c(2:4),返回每个元素的匹配位置(无匹配则返回NA),最终%in%转换为布尔向量[FALSE, TRUE, FALSE, TRUE, FALSE],这符合case_when()需要的逐元素判断条件。 - 输入为数据框时:
match()会把整个数据框当作单一对象与目标集合比对。由于数据框和向量c(2:4)类型不匹配,match()返回长度为1的NA,转换为布尔值即FALSE。这意味着第三个条件对所有行都不成立。
3. case_when的条件要求
case_when()要求每个条件返回长度与输入数据一致的布尔向量。单括号索引导致第三个条件返回长度为1的布尔值,case_when()会将其循环广播为长度5的全FALSE向量,因此除第一行匹配第一个条件外,其余行无符合规则的条件,最终返回NA。
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

