我在完成这项简单任务时遇到了麻烦。
在以下data.frame
中,如何为每列添加包含Sepal.Length*0.75 + Sepal.Width*0.25
结果的额外行?谢谢
as.data.frame(t(iris[1:5,1:4]))
1 2 3 4 5
Sepal.Length 5.1 4.9 4.7 4.6 5.0
Sepal.Width 3.5 3.0 3.2 3.1 3.6
Petal.Length 1.4 1.4 1.3 1.5 1.4
Petal.Width 0.2 0.2 0.2 0.2 0.2
答案 0 :(得分:3)
来自@akrun的答案似乎是最好的,但如果您只想使用最终数据集,可以使用行引用 -
x <- as.data.frame(t(iris[1:5,1:4]))
x[c('new'),] <- x[c('Sepal.Length'), ]*0.75 + x[c('Sepal.Width'), ]*0.25
答案 1 :(得分:2)
我们需要在转置之前创建一个列,因为t
会转换为matrix
而matrix
只能容纳一个class
。由于“虹膜”的第五列不是“数字”,因此在进行转置时,整个matrix
会转换为character
。因此,不是在事后进行计算,而是在转置之前进行
df1 <- iris[1:5,]
df1$new <- with(df1, Sepal.Length * 0.75 + Sepal.Width *25)
t(df1)
根据更新的结构,我们根据行名称对矩阵'm1'的行进行子集,进行计算并使用原始矩阵进行rbind
m1 <- as.data.frame(t(iris[1:5,1:4]))
m2 <- rbind(m1, new = m1["Sepal.Length",] * 0.75 + m1["Sepal.Width", ] * 0.25)
m2
# 1 2 3 4 5
#Sepal.Length 5.1 4.900 4.700 4.600 5.00
#Sepal.Width 3.5 3.000 3.200 3.100 3.60
#Petal.Length 1.4 1.400 1.300 1.500 1.40
#Petal.Width 0.2 0.200 0.200 0.200 0.20
#new 4.7 4.425 4.325 4.225 4.65