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

问题描述 投票:1回答:3

我有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。我应该使用连接还是有其他有效方法吗?

r dataframe
3个回答
2
投票

我们可以通过'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" 

1
投票

使用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吗?别的什么?


1
投票

使用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"
© www.soinside.com 2019 - 2024. All rights reserved.