r - 在R中不同长度的两个向量中查找匹配值
问题描述
我有两个带有物种名称的载体,采用两种不同的方法。有些名称相同,有些名称不同,并且都以不同的方式排序。示例: 列表 1:c(Homo sapiens sapiens, Homo sapiens neanderthalensis, Homo erectus,...,n) 列表 2: c(Homo erectus, Homo sapiens, Homo neanderthalensis,...,n+1)
我写 n 和 n+1 来表示这些列表有不同的长度。
我想创建一个由两个值组成的新列表:如果两个向量之间存在匹配(例如直立人),我希望列表 2 的名称位于列表中名称的位置1,或者如果列表 1 中的位置不匹配,则为“0”。所以在这种情况下,这个新列表将是 newlist:c(0,0, Homo erectus,...)
为此,我编写了以下代码,但它不起作用。
data<-read.table("species.txt",sep="\t",header=TRUE)
list1<-as.vector(data$Species1)
list2<-as.vector(data$Species2)
newlist<-as.character(rep(0,length(list1)))
for (i in 1:length(list1)){
for (j in 1:length(list2)){
if(list1[i] == list2[j]){newlist[i]<- list2[j]}else {newlist[i]= 0}
}
}
我希望这很清楚。
谢谢你的帮助!
解决方案
以这个可重现的例子为例:
set.seed(1)
list1 <- letters[1:10]
list1names
list2 <- letters[sample(1:10, 10)]
您可以使用以下方法避免循环ifelse
:
newlist <- ifelse(list1==list2, list2, 0)
问题是你没有申报newname
,你的意思是newlist
?
如果要使用循环,则只能使用一个循环而不是 2,因为length(list1)
= length(list2)
:
for (i in 1:length(list1)){
if(list1[i] == list2[i]){newlist[i]<- list2[i]}else {newlist[i]= 0}
}
一般来说,如果你想匹配向量中的元素,你可以match
这样使用:
> list1
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
> list2
[1] "c" "d" "e" "g" "b" "h" "i" "f" "j" "a"
> match(list1, list2)
[1] 10 5 1 2 3 8 4 6 7 9
如您所见,获取与 中的元素相等的match
元素的索引。这在您有另一个表的情况下很有用,并且您想从 data2 中获取相应元素的列以获取 data$list1 in 中的相应元素,您可以使用:list2
list1
data2
data2$list3
data <- data.frame(list1, list2)
list3 <- list2
columntoget <- 1:length(list2)
data2 <- data.frame(list3, columntoget)
data$mynewcolumn <- data2$columntoget[match(data$list1, data2$list3)]
> data$mynewcolumn
[1] 10 5 1 2 3 8 4 6 7 9
推荐阅读
- javascript - How to change the input type range value after entering the value in the input box?
- html - 从巨大的 HTML 页面中提取少量文本并忽略标签和其余部分的正则表达式
- mysql - 在 SQL 子查询上使用 SUM() 时如何提高速度?
- python - 获取“NoneType”对象没有“发送”属性
- reactjs - 在不同端口上显示单个反应应用程序
- django - Django:无法为用于检索数据的模型实例化抽象模型
- python - Simpleaudio 没有在 crontab 下运行
- c++ - for_each 作为 lambda 函数
- javascript - 权限覆盖不适用于 discordjs
- asp.net-core - 在 Windows Server 2016 上发布 IIS 10 后将 Blazor webassembly 放在哪里?