- Я думаю, что вы чрезмерно используете
lapply
;поскольку вы работаете с одним столбцом во фрейме, вам нет необходимости использовать его здесь. - В результатах будет
NA
с, по крайней мере, с этими данными (и вы, вероятно, должнывсе равно остерегайтесь этого).По этой причине я предлагаю промежуточную / временную переменную.
Для вышеприведенного # 2 я буду держать переменную в кадре (а затем удалять ее) для простоты ассоциации, хотя в этом нет необходимости.для этого его так же легко можно сохранить в отдельном векторе, а затем назначить после исправления.
df1$tmp <- df2$Key[ match(df1$body_site, df2$Tissue) ]
head(df1)
# body_site tmp
# 1 Lung <NA>
# 2 Lung <NA>
# 3 Brain - Amygdala BRNAMY
# 4 Brain - Amygdala BRNAMY
# 5 Brain - Caudate (basal ganglia) <NA>
# 6 Brain - Caudate (basal ganglia) <NA>
Это NA
s, с которыми вам следует опасаться ... в следующей части используютсяновый столбец, только если нет NA
.
df1$tmp <- ifelse(is.na(df1$tmp), df1$body_site, df1$tmp)
head(df1)
# body_site tmp
# 1 Lung Lung
# 2 Lung Lung
# 3 Brain - Amygdala BRNAMY
# 4 Brain - Amygdala BRNAMY
# 5 Brain - Caudate (basal ganglia) Brain - Caudate (basal ganglia)
# 6 Brain - Caudate (basal ganglia) Brain - Caudate (basal ganglia)
Теперь очистка:
df1$body_site <- df1$tmp
df1$tmp <- NULL
Альтернатива: объединения.
library(dplyr)
left_join(df1, df2, by=c("body_site" = "Tissue")) %>% head()
# body_site Key
# 1 Lung <NA>
# 2 Lung <NA>
# 3 Brain - Amygdala BRNAMY
# 4 Brain - Amygdala BRNAMY
# 5 Brain - Caudate (basal ganglia) <NA>
# 6 Brain - Caudate (basal ganglia) <NA>
(такая же очисткатребуется)
library(data.table)
head( merge(df1, df2, by.x="body_site", by.y="Tissue", all.x=TRUE) )
# body_site Key
# 1: Brain - Amygdala BRNAMY
# 2: Brain - Amygdala BRNAMY
# 3: Brain - Caudate (basal ganglia) <NA>
# 4: Brain - Caudate (basal ganglia) <NA>
# 5: Brain - Spinal cord (cervical c-1) <NA>
# 6: Brain - Spinal cord (cervical c-1) <NA>
(требуется такая же очистка)
Данные:
df1 <- read.csv(header=T, stringsAsFactors=F, text='
body_site
Lung
Lung
Brain - Amygdala
Brain - Amygdala
Brain - Caudate (basal ganglia)
Brain - Caudate (basal ganglia)
Lung
Lung
Skin - Sun Exposed (Lower leg)
Skin - Sun Exposed (Lower leg)
Brain - Spinal cord (cervical c-1)
Brain - Spinal cord (cervical c-1)')
df2 <- read.csv(header=T, stringsAsFactors=F, text='
Tissue,Key
Adipose - Subcutaneous,ADPSBQ
Adipose - Visceral (Omentum),ADPVSC
Adrenal Gland,ADRNLG
Artery - Aorta,ARTAORT
Artery - Coronary,ARTACRN
Artery - Tibial,ARTTBL
Bladder,BLDDER
Brain - Amygdala,BRNAMY
Brain - Anterior cingulate cortex (BA24),BRNACC')