我原来的问题定义不明确且令人困惑。为了清晰和额外的背景,这里再次删除了无关的列。
我的最终游戏是使用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
但这是我的图表所需的表格。
答案 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