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
(。
此外,B
的Name
列部分为标题大小写,而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()
后的A
和B
:
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")