在R中用ifelse切换两个dataframe为何得到列表?如何正确实现?
R中根据条件切换DataFrame的正确写法
问题场景
需要让变量finaldf根据条件指向DataFrame a或b,但使用ifelse()后返回的是列表而非DataFrame:
用户代码:
a = data.frame(a = c(1:10), b = c(1:10)) b = data.frame(c = c(11:20), d = c(11:20)) g = 'testB' finaldf = ifelse(g == "testB", b, a)
运行结果:
> finaldf [[1]] [1] 11 12 13 14 15 16 17 18 19 20 > class(finaldf) [1] "list"
问题原因
ifelse()是向量化函数,会对输入的每个元素逐一判断并返回对应结果。当传入DataFrame时,它会将DataFrame拆分为列(列表的单个元素)进行处理,最终返回的是由列组成的列表,而非完整的DataFrame。
正确写法
因为这里的判断条件是标量(g是单个字符串),直接使用标准的if-else语句即可:
a = data.frame(a = c(1:10), b = c(1:10)) b = data.frame(c = c(11:20), d = c(11:20)) g = 'testB' finaldf = if(g == "testB") b else a
验证结果:
> finaldf c d 1 11 11 2 12 12 3 13 13 4 14 14 5 15 15 6 16 16 7 17 17 8 18 18 9 19 19 10 20 20 > class(finaldf) [1] "data.frame"
备选方案(针对向量条件场景)
如果你的判断条件是向量,需要向量化处理时,可以将DataFrame放入列表,通过索引提取:
finaldf = list(a, b)[[ifelse(g == "testB", 2, 1)]]
但对于单条件判断的场景,标准if-else更简洁清晰。
内容的提问来源于stack exchange,提问作者Priya Patel
相关产品推荐
相关产品推荐

