【问题标题】:rdata: applying dist() over a data frame's rowsrdata:在数据框的行上应用 dist()
【发布时间】:2015-05-18 01:36:30
【问题描述】:

我可以这样做:

data <- read.csv("data.csv")
p1 <- subset(data, player_name == 'Player1')
p2 <- subset(data, player_name == 'Player2')

dist(rbind(p1[,c("gp","points")], p2[,c("gp","chances_for","chances_for_help")]))

我知道我的距离。但是data 里面有超过 1000 行,我想要每一行根据 GP 和 point 最相似的十个记录,但我不太清楚。

类似:

apply(data, 1, function(p) {
    dist(rbind(p, data))
})

但显然这是行不通的。这里有快速解决方法吗?

示例数据:

player_name,gp,points
Player 1,82,95
Player 2,80,88
Player 3,81,84
Player 4,82,90
Player 5,82,77

【问题讨论】:

  • 我认为对整个集合执行一次dist,然后从每一行中选择最低的情况比运行distnrow 次更合适。
  • 有什么简单的例子吗?
  • out &lt;- as.matrix(dist(dat[,c("gp","points")])) 然后apply(out, 1, function(x) colnames(out)[order(x)[2:4]] ) 最接近的 3 场比赛? (最接近的匹配将是同一行,因此从 2 开始索引)。我怀疑这是非常有效的,但是那种逻辑。
  • 我知道这给了我什么,但它给了我矩阵中的值。我怎样才能将它应用回原来的 data 集合,以便它与玩家姓名相关联?
  • apply(out, 1, function(x) order(x)[2:4] ) 返回最接近匹配的原始dat 数据集的行号。

标签: r rdata


【解决方案1】:

@thelatemail 基本上已经给了你完整的答案。因此,进一步了解他的方法,您可以通过以下方式对其进行扩展(我正在使用 dplyr 库)。

首先创建一个row id:

library(dplyr)
data <- data %>% mutate(rowid = row_number())

...并将距离数据转换为数据框:

dist_data <- as.data.frame(t(apply(out, 1, function(x) colnames(out)[order(x)[2:4]])))
dist_data <- dist_data %>% mutate(rowid = row_number())

然后你可以简单地加入rowid

data <- data %>% left_join(dist_data, by="rowid")

要添加球员的名字,你只需要创建某种球员索引数据框并使用相同的想法做更多的连接:

data$V1 <- as.numeric(data$V1)
data$V2 <- as.numeric(data$V2)
data$V3 <- as.numeric(data$V3)

# now we have to remap the V1, V2, V3 to the player_name and id's..
# we can do this by create a name dataset with the indexes...
name_index <- dplyr::select(data, player_name, rowid)

data %>% 
  left_join(rename(name_index, closest_name1=player_name, V1=rowid)) %>% 
  left_join(rename(name_index, closest_name2=player_name, V2=rowid)) %>%
  left_join(rename(name_index, closest_name3=player_name, V3=rowid)) %>%
  dplyr::select(-V1, -V2, -V3)

输出:

  player_name gp points rowid closest_name1 closest_name2 closest_name3
1    Player 1 82     95     1      Player 3      Player 2      Player 2
2    Player 2 80     88     2      Player 3      Player 3      Player 1
3    Player 3 81     84     3      Player 1      Player 4      Player 4
4    Player 4 82     90     4      Player 1      Player 1      Player 2
5    Player 5 82     77     5      Player 2      Player 2      Player 3

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2021-11-09
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多