2015-11-30 39 views
1

我有一个数据帧表示图表的边界列表,如下所示: | 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)) 

它工作正常,但每次交换的用户在一排的时候,它改变了用户2名成数。我猜这是因为它没有办法跟踪第一次交换后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) ` 

但我没有得到我所期待的结果,实际上是找了很多更复杂的比我希望的那样。

任何人有任何想法? 谢谢

+2

是什么类型的数据?也许他们只是因素? – Tim

+0

对!猜测在故障排除时打开你的眼睛会帮助Oo –

回答

1

您可能正在处理因素,并用因数中的数字替换名称。您需要先在列上使用as.character

network_edge_list$user1 <- as.character(network_edge_list$user1) 
network_edge_list$user2 <- as.character(network_edge_list$user2) 

那么你的代码应该只是罚款

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