如何将单个列从一个文件合并到另一个文件

时间:2017-08-28 18:35:56

标签: r merge

A

phy     44
chem    46  
maths   44  
biol    42
his     38
comm    40


B
Name    RaK
Phy     45
chem    43
maths   41
His     38
Comm    48
geo     49

预期输出

            RaK
phy     44  45
chem    46  43
maths   44  41
biol    42   0
his     38  38
comm    40  48

我需要像join(-a1 a,b)这样的东西。可以用R做吗? 第一个文件没有列标题。

2 个答案:

答案 0 :(得分:2)

读入数据:

A <- read.table(text="phy     44
chem    46  
maths   44  
biol    42
his     38
comm    40", as.is=TRUE)

B <- read.table(header=TRUE, text="Name    RaK
phy    45
chem    43
maths   41
his     38
comm    48
geo     49", as.is=TRUE)

as.is = TRUE参数将Name列保留为字符,而不是转换为factor。在合并两个不同的data.frame时,这是首选。现在,将列名添加到A。

names(A) <- c("Name", "col1")

执行合并,将所有行保留在A中,无论B是否有这样的行。因为两个data.frames都有一个共同的名称,所以没有必要添加一个by语句,尽管这可能是更好的做法。

dat <- merge(A, B, all.x=TRUE)

返回

dat
   Name col1 RaK
1  biol   42  NA
2  chem   46  43
3  comm   40  48
4   his   38  38
5 maths   44  41
6   phy   44  45

请注意,缺少Rak的第一个值(NA)。要将其替换为0,您可以使用

dat$RaK[is.na(dat$RaK)] <- 0

已经完成了。

dat
   Name col1 RaK
1  biol   42   0
2  chem   46  43
3  comm   40  48
4   his   38  38
5 maths   44  41
6   phy   44  45

答案 1 :(得分:2)

OP已请求加载或合并文件for i in model2.layers[:10]: model.add(i)所有行<{1}},以使预期结果包含A(来自{{1} }})但不是B(来自biol)。

此外,A的{​​{1}}列部分属于标题,而geo的相应列则属小写。

假设B的数据存储在名为Name的csv文件中,其中B的第一行为空(空白)。同样地,对于A,但这里第一行构成了列标题。

使用A这可以使用&#34; one-liner&#34;来完成:

"A.csv"
A.csv

Bdata.table自己的更快版library(data.table) # read B, convert Name column to lower case fread("B.csv")[, Name := tolower(Name)][ # read A and right join = all rows of A, only matching rows of B fread("A.csv"), on = c("Name" = "V1")][ # replace NA by 0 is.na(RaK), RaK := 0L][]

数据

为了重现性,在{/ 1}}的调用之后, Name RaK V2 1: phy 45 44 2: chem 43 46 3: maths 41 44 4: biol 0 42 5: his 38 38 6: comm 48 40 fread() 是:

data.table