为什么我无法在使用cbind创建的数据框中添加数字?

4
我正在寻求如何从两个数据框中列出的值相减的建议。在下面的示例中,使用数据框A和B,我想要在第一列向量匹配的条件下相减第二列的值。例如,当向量X1为R1时,则计算 5.1 - 5 和 4.8 - 5。

A<-data.frame(cbind(c('R1','R1','R2','R4','R4','R4'),c(5.1,4.8,4.9,5.0,5.0,5.3)))

B<-data.frame(cbind(c('R1','R2','R3','R4'),c(5,4.9,5.2,5.1)))


你用了一种奇怪的方式创建了数据框,导致数字变成了因子。但是很好的是,你提供了一个可重现的例子。 - Richie Cotton
3个回答

3

一般的R语言建议:不要在不必要的情况下使用cbind

A <- data.frame(X1=c('R1','R1','R2','R4','R4','R4'),X2=c(5.1,4.8,4.9,5.0,5.0,5.3))
B <- data.frame(X1=c('R1','R2','R3','R4'),X2=c(5,4.9,5.2,5.1))

你将这些数字分解成因数。但是你不能对因数应用算术运算符。

当存在非唯一匹配时,合并函数返回所有可能的配对:

merge(A,B, by=1)
merge(A,B, by=1)[,2] - merge(A,B, by=1)[,3]
#[1]  0.1 -0.2  0.0 -0.1 -0.1  0.2

谢谢你,Richie和DWin!非常感谢。 - Thomas Larsen

2

将数据定义为数字列确保这些列中的值都是数字类型(为了提高可读性,可以添加空格)。

A <- data.frame(
  X1 = c('R1', 'R1', 'R2', 'R4', 'R4', 'R4'), 
  X2 = c(5.1, 4.8, 4.9, 5.0, 5.0, 5.3)
)
B <- data.frame(
   X1 = c('R1', 'R2', 'R3', 'R4'), 
   X2 = c(5, 4.9, 5.2, 5.1)
)

合并数据框,然后用结果减去列。
merged <- merge(A, B, "X1")
with(merged, X2.x - X2.y)

0

这是使用向量名称的解决方案。

A <- data.frame(
  X1 = c('R1', 'R1', 'R2', 'R4', 'R4', 'R4'), 
  X2 = c(5.1, 4.8, 4.9, 5.0, 5.0, 5.3),
  stringsAsFactors = FALSE
)

L <- c(5, 4.9, 5.2, 5.1)
names(L) <- c('R1', 'R2', 'R3', 'R4')

A$X2-L[A$X1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接