簡體   English   中英

如何將單列從一個文件合並到另一個文件

[英]How can I merge a single column from one file to another file

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參數將Name列保留為字符,而不是轉換為factor。 合並兩個不同的data.frames時,這是首選方法。 現在,將列名稱添加到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"的第一A.csv空(空白)。 對於B同樣,但是這里的第一行包含列標題。

使用data.table可以使用“ 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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM