这几天, 讨论群频繁反应关于 DEseq2 分析的报错:arguments imply differing number of rrows
。这个代码经过了很多次培训的测试,按说不应该有问题,就远程连接调试了下,发现问题出在最近刚改的数据框索引上了。这个常见问题之前总会考虑着,这次修改时被忽略了,写推文记录下。
我们常用[ , ]
提取数据框 (data.frame
):
- 如果是多列数据框,提取后还是数据框;
- 如果是单列数据库,提取后就被自动转成了
vector
,想再按照数据库的方式使用就会报错; - 提取时加上
drop=F
就可以避免这个问题。
举例如下:
代码语言:javascript复制text <- "SampletGroup
trt_1ttrt
trt_2ttrt
trt_3ttrt
untrt_1tuntrt
untrt_2tuntrt
untrt_3tuntrt
"
# 读入文件,存储为数据框
df <- read.table(text=text, sep = "t", row.names=1, header=T)
# 查看数据框结果
df
# Group
# trt_1 trt
# trt_2 trt
# trt_3 trt
# untrt_1 untrt
# untrt_2 untrt
# untrt_3 untrt
操作下列提取,提取第一列(当然只有一列)
代码语言:javascript复制a1 = df[, 1]
a1
# 提取后变成 vector 了
# [1] "trt" "trt" "trt" "untrt" "untrt" "untrt"
# 希望提取行名时,给出了 NULL
rownames(a1)
# NULL
通常我们希望提取后,数据框还是数据框,下游操作行为一致 (增加drop=F
参数)。
a2 = df[,1,drop=F]
# 增加drop=F后,提取后还是保持数据库的格式
a2
# Group
# trt_1 trt
# trt_2 trt
# trt_3 trt
# untrt_1 untrt
# untrt_2 untrt
# untrt_3 untrt
# 提取行名也正常了
rownames(a2)
# [1] "trt_1" "trt_2" "trt_3" "untrt_1" "untrt_2" "untrt_3"
建议data.frame
的操作始终加参数drop=F
。
题图来自:https://pixabay.com/photos/dementia-alzheimer-s-dependent-3051832/