R语言按Plot_ID列表筛选数据框行时遇警告问题求助
问题原因与解决办法
1. 先搞定id_kort的格式问题
你用c(df[,"Plot_ID"])拿ID列表的时候,如果df是tidy风格的数据框(比如tibble),df[,"Plot_ID"]返回的是单列数据框不是向量,套个c()会变成列表,这就导致%in%匹配时出现维度不匹配的警告。
正确提取向量的方法:
# 最省事的方法:用$直接提取列向量 id_kort <- df$Plot_ID # 要是非得用索引,普通数据框可以这么写,tibble要加drop=TRUE id_kort <- df[,"Plot_ID", drop=TRUE]
另外如果Plot_ID是因子类型,转成字符型能避免匹配出错:
id_kort <- as.character(df$Plot_ID)
2. 重新筛选数据
用修正后的id_kort筛选,两种靠谱方式:
方式1:用subset
vg_data_kort <- subset(df2, Plot_ID %in% id_kort)
方式2:用行索引(稳定性更高)
vg_data_kort <- df2[df2$Plot_ID %in% id_kort, ] # 要是用tidyverse的话,推荐用filter library(dplyr) vg_data_kort <- df2 %>% filter(Plot_ID %in% id_kort)
3. 为啥df2[as.character(df$Plot_ID),]全是NA?
你这么写是把Plot_ID的值当行名去索引df2,但df2的行名默认是数字(比如1、2、3...),根本不是你的Plot_ID字符串,自然找不到匹配的行,所以全是NA。非要这么用的话,得先把df2的行名改成Plot_ID:
# 先设置行名 rownames(df2) <- df2$Plot_ID # 再索引 vg_data_kort <- df2[as.character(df$Plot_ID), ]
不过这种方法不推荐,行名很容易出问题,还是用前面的筛选方法更稳妥。
内容的提问来源于stack exchange,提问作者Flóki
相关产品推荐
相关产品推荐

