R语言 根据共享变量顺序添加行

zd287kbt  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(114)

我有一个reference表,其中包含一个样本列表,以及已经添加到表中的几个值(这里:Value1):

reference <- data.frame(sample=letters[1:5], Value1=1:5)

> reference
  sample Value1
1      a      1
2      b      2
3      c      3
4      d      4
5      e      5

字符串
在这个表中,我需要添加属于各个样本的其他数据(这里:Value2Value4)(每个样本的数据= myinput

myinput_a <- data.frame(sample="a", Value2=3, Value3=5, Value4=9)

myinput_a
  sample Value2 Value3 Value4
1      a      3      5      9

myinput_b <- data.frame(sample="b", Value2=5, Value3=0, Value4=2)
myinput_c <- data.frame(sample="c", Value2=7, Value3=1, Value4=3)


这些myinputs与reference共享sample变量,因此必须将它们追加到正确的行。
这是我们想要的最终结果(注意,d和e没有相加,所以有一些NA值:

myoutput <- data.frame(sample=letters[1:5], Value1=1:5, Value2=c(3,5,7,NA,NA), Value3=c(5,0,1,NA,NA), Value4=c(9,2,3,NA,NA))``` 

> myoutput
  sample Value1 Value2 Value3 Value4
1      a      1      3      5      9
2      b      2      5      0      2
3      c      3      7      1      3
4      d      4     NA     NA     NA
5      e      5     NA     NA     NA


实际上,样本和值的数量非常大,所以我想把整个事情设计成一个循环。我不明白的是,当添加第一个样本时,我添加了列,而对于所有后续样本,我添加了行。我很感激任何关于如何设计方法的建议!

wyyhbhjk

wyyhbhjk1#

使用rbind按行绑定你的输入框架,然后使用merge连接到你的引用框架:

myinput <- rbind(myinput_a, myinput_b, myinput_c)

merge(reference, myinput, by = "sample", all.x = TRUE)
#>   sample Value1 Value2 Value3 Value4
#> 1      a      1      3      5      9
#> 2      b      2      5      0      2
#> 3      c      3      7      1      3
#> 4      d      4     NA     NA     NA
#> 5      e      5     NA     NA     NA

字符串
或者使用dpylr,你可以这样做:

library(dplyr, warn = FALSE)
myinput <- bind_rows(myinput_a, myinput_b, myinput_c)

left_join(reference, myinput, by = "sample")
#>   sample Value1 Value2 Value3 Value4
#> 1      a      1      3      5      9
#> 2      b      2      5      0      2
#> 3      c      3      7      1      3
#> 4      d      4     NA     NA     NA
#> 5      e      5     NA     NA     NA

kgqe7b3p

kgqe7b3p2#

另一个使用cbind的基础R解决方案:

df <- rbind(myinput_a, myinput_b, myinput_c)
x <- nrow(df)
y <- nrow(reference)

df[x+(y-x),] <- NA
cbind(reference, df[-1])

sample Value1 Value2 Value3 Value4
1      a      1      3      5      9
2      b      2      5      0      2
3      c      3      7      1      3
4      d      4     NA     NA     NA
5      e      5     NA     NA     NA

字符串

相关问题