我有一个表示图表边缘列表的数据框,如下所示:
| user1 | user2 | delta_t |
|-------|-------|---------|
| Bob | Alice | 10 |
| Jake | June | -1 |
我想基于交互的时间创建有向图,并且使用igraph,始终从user1到user2绘制边。
因此,我想浏览我的数据帧,并根据delta_t重新排列节点的顺序。
这就是我现在所拥有的:
network_edge_list <- transform(network_edge_list, user1 = ifelse(delta_t > 0, user2, user1), user2 = ifelse(delta_t > 0 , user1, user2))
它工作正常但是每次交换用户时,它都会将user2的名称更改为数字。我猜这是因为它无法在第一次交换后跟踪user2的字符串值,因此它会进行任意替换。 虽然在数据框架上一致地发生,并且一旦用户变成一个数字,这个数字在整个数据框中被正确使用,这非常烦人,并且使我的下一步更加困难。
我也尝试过:
myfunction <- function(df){
if (df[3] > 0){
temp <- df[1]
df[1] <- df[2]
df[2] <- temp
}
}
df <- apply(df, 1, function(x) myfunction) `
但我没有得到我期待的结果,实际上看起来比我希望的要复杂得多。
有人有什么想法吗? 感谢
答案 0 :(得分:1)
您可能正在处理因子,它会将该名称替换为该因子中的数字。您需要先在列上使用as.character
。
network_edge_list$user1 <- as.character(network_edge_list$user1)
network_edge_list$user2 <- as.character(network_edge_list$user2)
那么你的代码应该可以正常工作
答案 1 :(得分:0)
df1 <- read.table(text="
user1 user2 delta_t
Bob Alice 10
Jake June -1", head=T, as.is=T)
df1 <- rbind(df1, df1)
df1
# user1 user2 delta_t
# 1 Bob Alice 10
# 2 Jake June -1
# 3 Bob Alice 10
# 4 Jake June -1
df1[df1$delta_t>0, 1:2] <- df1[which(df1$delta_t>0), 2:1]
df1
# user1 user2 delta_t
# 1 Alice Bob 10
# 2 Jake June -1
# 3 Alice Bob 10
# 4 Jake June -1