我有以下列表(实际列表较大但我把它缩小了以便更容易理解:
clubs <- c("Arsenal", "Chelsea", "Southhampton")
我想做的是绕过俱乐部并找到所有对手。所以在南汉普顿的情况下:
[1] "Southhampton VS Arsenal"
[1] "Southhampton VS Chelsea"
[1] "Southhampton VS Southhampton
我想为所有俱乐部做这件事(阿森纳和切尔西也是如此)。
因此我写了以下代码:
distances <- function(list) {
#list for storing purposes
list_new <- c()
count <- length(list)
#perform one loop for each club
for (j in count) {
for (i in list){
#get the first club
var <- list[j]
#fetch list item
var_opponent <- list(i)
#print(var_opponent)
var_total <- paste0(var, " VS ", var_opponent)
print(var_total)
list_new <- c(list_new, var_total)
}
}
}
它没有完全奏效,但是因为这是我的输出:
> distances(clubs)
[1] "Southhampton VS Arsenal"
[1] "Southhampton VS Chelsea"
[1] "Southhampton VS Southhampton"
有人可以向我解释为什么我只能获得最后一个俱乐部的记录吗?
答案 0 :(得分:1)
您的代码中存在多个错误。
您需要了解的第一件事是R中的for循环遍历元素列表。让我们假设您的代码中的计数为3。然后第一个for循环将是
for(j in 3)
所以j将是列表中包含单个3的所有元素。 在下一个for循环中,您以正确的方式遍历列表。
for(i in list)
将每个俱乐部列表分配给变量i一次一个。因此,俱乐部名称(不是俱乐部名称的索引)存储在变量i中,您无需索引列表即可获得俱乐部名称。
第二个错误是使用
“索引”列表 list(i)
这与传递给函数的list参数没有任何关系。这是对list函数的调用,这将把变量i放在一个列表中。
这就是你的代码应该是这样的
distances <- function(clubs) {
list_new <- c()
#perform one loop for each club
for (club1 in clubs) {
for (club2 in clubs){
var_total <- paste0(club1, " VS ", club2)
print(var_total)
list_new <- c(list_new, var_total)
}
}
}
这是解决问题的更好方法
distances <- function(clubs) combn(rep(clubs,2),2,function(x) paste(x[1] ,"VS", x[2]))
答案 1 :(得分:0)
我能够通过两次直接迭代俱乐部列表来纠正你的功能:
distances <- function(lst) {
# list for storing purposes
list_new <- c()
count <- length(lst)
# perform one loop for each club
for (j in list) {
for (i in list) {
# get the first and second club
# print(var_opponent)
var_total <- paste0(j, " VS ", i)
print(var_total)
list_new <- c(list_new, var_total)
}
}
}
> distances(clubs)
[1] "Arsenal VS Arsenal"
[1] "Arsenal VS Chelsea"
[1] "Arsenal VS Southhampton"
[1] "Chelsea VS Arsenal"
[1] "Chelsea VS Chelsea"
[1] "Chelsea VS Southhampton"
[1] "Southhampton VS Arsenal"
[1] "Southhampton VS Chelsea"
[1] "Southhampton VS Southhampton"