在R软件,怎样将group_df的数据横向合并到数据库data中
时间: 2024-05-02 10:20:25 浏览: 102
可以使用dplyr包中的left_join()函数将group_df的数据横向合并到数据库data中,具体操作如下:
1. 确认group_df和data中用于合并的变量名相同。
2. 使用left_join()函数将group_df的数据横向合并到data中,例如:
```{r}
library(dplyr)
data <- left_join(data, group_df, by = "变量名")
```
其中,"变量名"是group_df和data中用于合并的变量名。
3. 合并后的数据保存在data中。
相关问题
代码改进:import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt from sklearn.datasets import make_blobs def distEclud(arrA,arrB): #欧氏距离 d = arrA - arrB dist = np.sum(np.power(d,2),axis=1) #差的平方的和 return dist def randCent(dataSet,k): #寻找质心 n = dataSet.shape[1] #列数 data_min = dataSet.min() data_max = dataSet.max() #生成k行n列处于data_min到data_max的质心 data_cent = np.random.uniform(data_min,data_max,(k,n)) return data_cent def kMeans(dataSet,k,distMeans = distEclud, createCent = randCent): x,y = make_blobs(centers=100)#生成k质心的数据 x = pd.DataFrame(x) m,n = dataSet.shape centroids = createCent(dataSet,k) #初始化质心,k即为初始化质心的总个数 clusterAssment = np.zeros((m,3)) #初始化容器 clusterAssment[:,0] = np.inf #第一列设置为无穷大 clusterAssment[:,1:3] = -1 #第二列放本次迭代点的簇编号,第三列存放上次迭代点的簇编号 result_set = pd.concat([pd.DataFrame(dataSet), pd.DataFrame(clusterAssment)],axis = 1,ignore_index = True) #将数据进行拼接,横向拼接,即将该容器放在数据集后面 clusterChanged = True while clusterChanged: clusterChanged = False for i in range(m): dist = distMeans(dataSet.iloc[i,:n].values,centroids) #计算点到质心的距离(即每个值到质心的差的平方和) result_set.iloc[i,n] = dist.min() #放入距离的最小值 result_set.iloc[i,n+1] = np.where(dist == dist.min())[0] #放入距离最小值的质心标号 clusterChanged = not (result_set.iloc[:,-1] == result_set.iloc[:,-2]).all() if clusterChanged: cent_df = result_set.groupby(n+1).mean() #按照当前迭代的数据集的分类,进行计算每一类中各个属性的平均值 centroids = cent_df.iloc[:,:n].values #当前质心 result_set.iloc[:,-1] = result_set.iloc[:,-2] #本次质心放到最后一列里 return centroids, result_set x = np.random.randint(0,100,size=100) y = np.random.randint(0,100,size=100) randintnum=pd.concat([pd.DataFrame(x), pd.DataFrame(y)],axis = 1,ignore_index = True) #randintnum_test, randintnum_test = kMeans(randintnum,3) #plt.scatter(randintnum_test.iloc[:,0],randintnum_test.iloc[:,1],c=randintnum_test.iloc[:,-1]) #result_test,cent_test = kMeans(data, 4) cent_test,result_test = kMeans(randintnum, 3) plt.scatter(result_test.iloc[:,0],result_test.iloc[:,1],c=result_test.iloc[:,-1]) plt.scatter(cent_test[:,0],cent_test[:,1],color = 'red',marker = 'x',s=100)
这段代码实现的是k-means聚类算法,但是有一些地方可以改进:
1. 函数kMeans中的createCent参数可以通过修改为直接传入质心的方式来更加灵活。
2. 函数kMeans中的distMeans参数可以修改为scipy库中的距离函数,如scipy.spatial.distance.cdist,来提高计算效率。
3. 函数kMeans中的clusterAssment可以使用pd.DataFrame来进行初始化,这样可以避免使用np.zeros和np.inf来进行初始化。
改进后的代码如下:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from scipy.spatial.distance import cdist
def randCent(dataSet, k):
"""
随机生成k个质心
"""
n = dataSet.shape[1] # 列数
data_min = dataSet.min()
data_max = dataSet.max()
# 生成k行n列处于data_min到data_max的质心
data_cent = np.random.uniform(data_min, data_max, (k, n))
return data_cent
def kMeans(dataSet, k, createCent=randCent, distMeans=cdist):
"""
k-means聚类算法
"""
centroids = createCent(dataSet, k) # 初始化质心,k即为初始化质心的总个数
result_set = pd.concat([pd.DataFrame(dataSet), pd.DataFrame()], axis=1, ignore_index=True)
# 将数据进行拼接,横向拼接,即将该容器放在数据集后面
clusterChanged = True
while clusterChanged:
clusterChanged = False
dist = distMeans(dataSet, centroids, metric='euclidean')
clusterAssment = np.argmin(dist, axis=1)
result_set.iloc[:, -1] = pd.Series(clusterAssment)
for i in range(k):
cent_df = result_set[result_set.iloc[:, -1] == i].mean() # 按照当前迭代的数据集的分类,进行计算每一类中各个属性的平均值
if not cent_df.empty:
centroids[i] = cent_df.iloc[:-1].values # 当前质心
clusterChanged = True
return centroids, result_set
x = np.random.randint(0, 100, size=100)
y = np.random.randint(0, 100, size=100)
randintnum = pd.concat([pd.DataFrame(x), pd.DataFrame(y)], axis=1, ignore_index=True)
cent_test, result_test = kMeans(randintnum, 3)
plt.scatter(result_test.iloc[:, 0], result_test.iloc[:, 1], c=result_test.iloc[:, -1])
plt.scatter(cent_test[:, 0], cent_test[:, 1], color='red', marker='x', s=100)
```
for (i in seq_along(data_subject)) { #create stack linechart linechart<-ggplot(data_subject[[i]],aes(x=ActivityName,y=ErythemaGrade,group=Zone,color=Zone,linetype=Zone))+ geom_line()+ geom_point()+ theme(axis.text.x = element_text(angle = 45, hjust = 1))+ scale_y_continuous(limits = c(0, 13))+ labs(title = paste(names(data_subject)[i]),x=NULL) #insert graphs into doc mydoc <- bhody_add_gg(mydoc, value = linechart)} 在这段代码中,我希望在一页上显示三个绘制的图像,应该如何添加命令语句?新建mydoc的时候,如何将页面设置为横向?以及能否在绘制折线图的同时,在每张图下方显示该折线图源数据的description分析表?
你可以使用`cowplot`包中的`plot_grid`函数将三个图像组合到一个页面上,并使用`rotate_pdf()`函数将页面设置为横向。以下是示例代码:
```
library(cowplot)
# create a list of linecharts
linecharts <- lapply(data_subject, function(df) {
ggplot(df, aes(x = ActivityName, y = ErythemaGrade, group = Zone, color = Zone, linetype = Zone)) +
geom_line() +
geom_point() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_y_continuous(limits = c(0, 13)) +
labs(title = names(data_subject)[[i]], x = NULL)
})
# combine the linecharts into a single plot grid
plot_grid(plotlist = linecharts, ncol = 3)
# insert the plot grid into the document
mydoc <- body_add_gg(mydoc, value = plot_grid(plotlist = linecharts, ncol = 3))
# rotate the page to landscape orientation
mydoc <- rotate_pdf(mydoc, landscape = TRUE)
# add a table of description analysis below each linechart
for (i in seq_along(data_subject)) {
# create the table
desc_table <- tableGrob(description_analysis(data_subject[[i]]))
# add the table to the document
mydoc <- body_add_gg(mydoc, value = desc_table)
}
```
在上面的代码中,`lapply()`函数用于遍历每个数据框并创建相应的折线图。`plot_grid()`函数将这些图像组合成一个网格,其中`ncol = 3`参数指定每行显示三个图像。在将图像添加到文档中之前,我们使用`rotate_pdf()`函数将页面旋转为横向。最后,使用一个循环来为每个图像添加一个描述性分析表格,其中`description_analysis()`是一个自定义函数,用于生成数据框的描述性统计信息。
阅读全文