交换同一行中列之间的元素

时间:2015-11-30 15:07:40

标签: r

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

但我没有得到我期待的结果,实际上看起来比我希望的要复杂得多。

有人有什么想法吗? 感谢

2 个答案:

答案 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
相关问题