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做吗?
第一个文件没有列标题。
答案 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
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][]
。
为了重现性,在{/ 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