R:基于现有数据帧创建和转换数据帧

时间:2014-11-14 16:18:43

标签: r dataframe

我原来的问题定义不明确且令人困惑。为了清晰和额外的背景,这里再次删除了无关的列。

我的最终游戏是使用networkD3创建强制网络图。为此,我需要两个数据帧。 第一个数据帧(dfNodes)列出了图中的每个节点及其分组。 Volt,Miata和Prius都是汽车,因此他们的组值为1。 十字军是一辆公共汽车,所以它在第3组。等等。

dfNodes dataframe:

id  name       group
0     vehicle   0
1     car       1
2     truck     2
3     bus       3
4     volt      1
5     miata     1
6     prius     1
7     tahoe     2
8     suburban  2
9     crusader  3

从这个数据帧我需要构建数据帧dfLinks以提供节点之间的链接。它必须看起来像:

dfLinks dataframe:

source  target
0           4
0           5
0           6
0           7
0           8
0           9
1           4
1           5
1           6
2           7
2           8
3           9

显示以下内容:
车辆与伏特,miata,prius,tahoe,郊区,十字军(它们都是车辆)相关联。 (0,4; 0,5 ... 0,9)
汽车与伏特,miata,prius(1,4; 1,5; 1,6)相关联 卡车与tahoe,郊区(2,7; 2,8)相关联 巴士与十字军(3,9)

相关联

链接vehicle-->model name (volt...crusader)--> type (car/bus/truck)而不是链接可能会很奇怪 vehicle--> type --> model name 但这是我的图表所需的表格。

2 个答案:

答案 0 :(得分:0)

我不了解创建第二个数据帧的标准;例如' car'在第二个数据帧中出现三次但在第一个数据帧中出现四次?如果您可以提供有关转换的更精确的详细信息,我可以尝试并提供更多帮助,但我的第一个建议是查看reshape包中的melt()和cast()函数: http://www.statmethods.net/management/reshape.html

答案 1 :(得分:0)

根据Phil和aosmith的回复,我再次回顾了我的问题。我有幸创建源数据帧(dfNodes),所以我从更上游接近问题,首先通过组合数据帧创建dfNodes,然后独立于dfNodes创建dfLinks而不是基于dfNodes。我觉得我的方法非常重要,但它确实给了我正在寻找的结果。这是代码。欢迎其他方法,建议和批评!你可以说,我是R的新手。

# Separate dataframes for the different categories of data vehicle <- data.frame(source=0, name="vehicle", group=0) carGroup <- data.frame(source=1, name="car", group=1) truckGroup <- data.frame(source=2, name="truck", group=2) busGroup <- data.frame(source=3, name="bus", group=3) cars <- data.frame(source=c(4,5,6), name=c("volt", "miata", "prius"), group=c(1,1,1)) trucks <- data.frame(source=c(7,8), name=c("tahoe", "suburban"), group=c(2,2)) buses <- data.frame(source=9, name="crusader", group=3) # 1. Build the dfNodes dataframe dfNodes <- rbind(vehicle, carGroup, truckGroup, busGroup, cars, trucks, buses) names(dfNodes)[1]<-"id" dfNodes
# 2. Build dfLinks dataframe. Only source and target columns needed # Bind Vehicle to the 3 different vehicle dataframes vehicleToCars <- cbind(vehicle, cars) vehicleToTrucks <- cbind(vehicle, trucks) vehicleToBuses <- cbind(vehicle, buses) # Bind the Vehicle Groups to the vehicles carGroupToCars <- cbind(carGroup, cars) truckGroupToTrucks <- cbind(truckGroup, trucks) busGroupToBuses <- cbind(busGroup, buses) # Stack into the final dfLinks dataframe dfLinks <- rbind(vehicleToCars, vehicleToTrucks, vehicleToBuses, carGroupToCars, truckGroupToTrucks, busGroupToBuses) names(dfLinks)[4]<-"target" dfLinks