我有一个数据框,我需要根据来自其他两个数据框的名称将后缀添加到列名称中,如果它不存在则为“UN”。 数据框看起来像,
head(df)
AE02 AE03 AE04 AE05 AE06 AE07 AE08 AE09 AE10 AE11 AE12
11.9619362364 18.5701402709 42.2010838789 28.0025053738 19.5589170223 18.1459582989 16.5292369479 32.4885640738 34.0342144643 31.6971000153 44.932255488
2.9904840591 3.9793157723 0 0 1.7780833657 1.7281865047 13.7743641233 4.3318085432 0 17.067669239 0
0 0 0 0 2.6671250485 0 4.5914547078 0 0 0 2.1396312137
和其他datafrme
head(phlike)
V1
AE06
AE08
AE09
AE12
DMR数据帧是不同长度的相同格式
这是我尝试过的,我创建了一个不在
中的函数`%notin%` = function(x,y,z) !(x %in% [y & z])
然后我在数据框中调用它,如下所示,
colnames(new)[colnames(new) %notin% Phlike$V1&DMR$V1 ] <- paste0("UN_", colnames(new)[colnames(new) %notin% Phlike$V1&DMR$V1 ])
但它引发了以下错误,
Error in colnames(new) %notin% Phlike$V1 :
argument "z" is missing, with no default
任何建议或更好的解决方案都会很棒
答案 0 :(得分:2)
我们可以否定%in%
然后更新匹配列:
# get the index of non-matching (!) columns
ix <- which(!colnames(new) %in% unique(c(Phlike$V1, DMR$V1)))
# then update with prefix
colnames(new)[ix] <- paste0("UN_", colnames(new)[ix])
答案 1 :(得分:2)
我认为您对代码的一个问题是%notin%
是三个参数的函数,而您没有传递它。
我的意思是,你需要调用%notin%函数,如下所示:
%notin% (colnames(new), Phlike$V1, DMR$V1)
答案 2 :(得分:0)
根据您的数据框架,我了解您要检查名称来自两个数据框:Phlike$V1&DMR$V1
和Phlike$V2&DMR$V1
。
然后你可以做
`%notin%` = function(x,y) !(x %in% y)
names_to_keep <- c(Phlike$V1&DMR$V1, Phlike$V2&DMR$V1)
colnames(new)[colnames(new) %notin% names_to_keep ] <- paste0("UN_", colnames(new)[colnames(new) %notin% names_to_keep ])