Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R合并而不复制列_R_Merge_Dataframe - Fatal编程技术网

R合并而不复制列

R合并而不复制列,r,merge,dataframe,R,Merge,Dataframe,我有两个数据帧。比如说 require('xlsx') csvData <- read.csv("myData.csv") xlsData <- read.xlsx("myData.xlsx") xlsData如下所示: Period CPI VIX 1 0.029 31.740 2 0.039 32.840 3 0.028 34.720 4 0.011 43.740 5 -0.003 35.3

我有两个数据帧。比如说

require('xlsx')
csvData <- read.csv("myData.csv")
xlsData <- read.xlsx("myData.xlsx")
xlsData如下所示:

Period  CPI     VIX
1       0.029   31.740
2       0.039   32.840
3       0.028   34.720
4       0.011   43.740
5       -0.003  35.310
6       0.013   26.090
7       0.032   28.420
8       0.022   45.080
Period  CPI     DJIA
1       0.029   12176
2       0.039   10646
3       0.028   11407
4       0.011   9563
5       -0.003  10708
6       0.013   10776
7       0.032   9384
8       0.022   7774
当我合并这些数据时,CPI数据被复制,并且在标题上加了一个后缀,这是有问题的(我的实际df中有更多的列)

我希望合并数据帧,而不复制具有相同名称的列。例如,我想要这种输出:

Period  CPI     VIX     DJIA
1       0.029   31.740  12176
2       0.039   32.840  10646
3       0.028   34.720  11407
4       0.011   43.740  9563
5       -0.003  35.310  10708
6       0.013   26.090  10776
7       0.032   28.420  9384
8       0.022   45.080  7774
我不想使用额外的“by”参数,也不想从一个df中删除列,因为两个df中重复的列太多了。我只是在寻找一种在合并过程中删除那些重复列的动态方法


谢谢

如果公共列的名称相同,则可以跳过
by
参数

?合并

默认情况下,数据帧合并到具有名称的列上,但列的单独规范可以由
By.x
By.y
给出

记住这一点,以下内容应该起作用(正如它对示例数据所起的作用):


您还可以按名称为您感兴趣的特定列编制索引。如果您只需要一个大型数据帧中的单个列/向量,这将非常有用

Period <- seq(1,8)
CPI <- seq(11,18)
VIX <- seq(21,28)
DJIA <- seq(31,38)
Other1 <- paste(letters)[1:8]
Other2 <- paste(letters)[2:9]
Other3 <- paste(letters)[3:10]

df1<- data.frame(Period,CPI,VIX)
df2<- data.frame(Period,CPI,Other1,DJIA,Other2,Other3)

merge(df1,df2[c("Period","DJIA")],by="Period") 

> merge(df1,df2[c("Period","DJIA")],by="Period")
  Period CPI VIX DJIA
1      1  11  21   31
2      2  12  22   32
3      3  13  23   33
4      4  14  24   34
5      5  15  25   35
6      6  16  26   36
7      7  17  27   37
8      8  18  28   38

谢谢。我不知道“by”是可选的。如果我的df长度不同怎么办?例如,假设csvData只有7行。我想保留xlsData的所有数据。然后cbind csvData(对于与csvData相对应的第8行,可以使用NULL)。@Clark,使用
all=TRUE
也许?示例:
merge(csvdata[1:7],xlsdata,all=TRUE)
Period  CPI     VIX     DJIA
1       0.029   31.740  12176
2       0.039   32.840  10646
3       0.028   34.720  11407
4       0.011   43.740  9563
5       -0.003  35.310  10708
6       0.013   26.090  10776
7       0.032   28.420  9384
8       0.022   45.080  7774
merge(csvData, xlsData)
#   Period    CPI   VIX  DJIA
# 1      1  0.029 31.74 12176
# 2      2  0.039 32.84 10646
# 3      3  0.028 34.72 11407
# 4      4  0.011 43.74  9563
# 5      5 -0.003 35.31 10708
# 6      6  0.013 26.09 10776
# 7      7  0.032 28.42  9384
# 8      8  0.022 45.08  7774
Period <- seq(1,8)
CPI <- seq(11,18)
VIX <- seq(21,28)
DJIA <- seq(31,38)
Other1 <- paste(letters)[1:8]
Other2 <- paste(letters)[2:9]
Other3 <- paste(letters)[3:10]

df1<- data.frame(Period,CPI,VIX)
df2<- data.frame(Period,CPI,Other1,DJIA,Other2,Other3)

merge(df1,df2[c("Period","DJIA")],by="Period") 

> merge(df1,df2[c("Period","DJIA")],by="Period")
  Period CPI VIX DJIA
1      1  11  21   31
2      2  12  22   32
3      3  13  23   33
4      4  14  24   34
5      5  15  25   35
6      6  16  26   36
7      7  17  27   37
8      8  18  28   38