在R中按列合并数字和字符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在R中按列合并数字和字符?相关的知识,希望对你有一定的参考价值。

我有2个df:

df1 <- data.frame(m = c("m1","m2","m3"), score = c(2,3,3))
df2 <- data.frame(m = c("m3", "m2", "m1"), dosage = c("a", "b", "c"))

我想把它结合起来:

m1  m2 m3
2c  3b 3a

我尝试过使用paste命令但是我没有使用colnames。我应该使用连接还是有其他有效方法吗?

答案

我们可以通过'm'列做一个merge(如果有常见的列名,它会在by论证中提到它而不提及它),然后transform通过pasteing'得分'和'剂量来创建'新列' ',通过索引对列进行子集化

transform(merge(df1, df2), newcolumn = paste0(score, dosage))[c(1,4)]

如果我们需要一个名为vector

dfN <- merge(df1, df2)
setNames(do.call(paste0, dfN[-1]), dfN[,1])
# m1   m2   m3 
#"2c" "3b" "3a" 
另一答案

使用dplyrtidyr的解决方案

df1 <- data.frame(m = c("m1","m2","m3"), score = c(2,3,3))
df2 <- data.frame(m = c("m3", "m2", "m1"), dosage = c("a", "b", "c"))

library(dplyr)
library(tidyr)

inner_join(df1, df2, by="m") %>%       # join data
  unite(v,score,dosage, sep = "") %>%  # unite two columns in one column
  spread(m,v)                          # reshape data

#   m1 m2 m3
# 1 2c 3b 3a

这假设所有m值都出现在两个数据集中。如果没有,您必须修改过程以匹配您的已排出输出。您是否忽略仅出现在一个数据集中的案例?你保留它们并填充NA吗?别的什么?

另一答案

使用data.tablet的另一种解决方案: -

df1 <- data.frame(m = c("m1","m2","m3"), score = c(2,3,3))
df2 <- data.frame(m = c("m3", "m2", "m1"), dosage = c("a", "b", "c"))
setDT(df1)
setDT(df2)
setkey(df2, m)
df <- df2[df1]
df[, dos := paste0(score, dosage)]
df <- df[, c("m", "dos")]
df <- t(df)
df

你会得到输出: -

    [,1] [,2] [,3]
m   "m1" "m2" "m3"
dos "2c" "3b" "3a"

以上是关于在R中按列合并数字和字符?的主要内容,如果未能解决你的问题,请参考以下文章

在R中按列匹配ID附加列

如何使用 R 在 csv 文件中按列添加数据?

在pandas DataFrame中按列计算唯一字符串[关闭]

在r中按多列排序矩阵

如何在 Laravel 的嵌套 2 级关系中按列排序?

在C#中按列对二维数组进行排序