r语言 - 如何将单个列从一个文件合并到另一个文件


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做到这一点吗? 第一个文件没有列标题。

读取数据:

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 参数将"名称"列保留为字符,而不是转换为因子。在合并两个不同的数据帧时,这是首选。现在,将列名添加到 A。

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

执行合并,保留 A 中的所有行,而不管 B 是否有这样的行。由于两个 data.frame 都有一个共同的名称,因此没有必要添加 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

OP 已请求将文件A的所有行与文件B接或合并,以便预期结果包含biol(来自A(但不包含geo(来自B(。

此外,BName列部分为标题大小写,而A的相应列为小写。

假设A数据存储在名为"A.csv"的 csv 文件中,其中第一行A.csv为空(空白(。同样适用于B但此处的第一行包含列标题。

有了data.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][]
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自己的,更快的read.table()版本。

数据

为了重现性,以下是调用fread()后的AB

A <- structure(list(V1 = c("phy", "chem", "maths", "biol", "his", 
"comm"), V2 = c(44L, 46L, 44L, 42L, 38L, 40L)), .Names = c("V1", 
"V2"), row.names = c(NA, -6L), class = "data.frame")
B <- structure(list(Name = c("phy", "chem", "maths", "his", "comm", 
"geo"), RaK = c(45L, 43L, 41L, 38L, 48L, 49L)), .Names = c("Name", 
"RaK"), row.names = c(NA, -6L), class = "data.frame")

相关内容

最新更新