我想在数据框中添加新列,并使用存储在另一个数据框中的预定义值填充。什么是最好的方法?
很高兴:如果新变量出现在d2中,是否可以使代码动态化?
d1 <- head(iris) # dataframe 1 ----------
var <- c("var1", "var2", "var3")
val <- c(5, 7, 1)
d2 <- as.data.frame(cbind(var, val)) # dataframe 2 ----------
第一个数据帧
第二个数据框
期望的输出
祝你好运
答案 0 :(得分:5)
一种方法是(这适用于任意数量的var
s)
d1[as.character(d2$var)] <- rep(d2$val, each = nrow(d1))
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species var1 var2 var3
# 1 5.1 3.5 1.4 0.2 setosa 5 7 1
# 2 4.9 3.0 1.4 0.2 setosa 5 7 1
# 3 4.7 3.2 1.3 0.2 setosa 5 7 1
# 4 4.6 3.1 1.5 0.2 setosa 5 7 1
# 5 5.0 3.6 1.4 0.2 setosa 5 7 1
# 6 5.4 3.9 1.7 0.4 setosa 5 7 1
答案 1 :(得分:3)
使用data.table
:
require(data.table)
setDT(d1)[, as.character(d2$var) := as.list(d2$val)]
as.character()
是必需的,因为您创建d2
的方式导致var
为factor
。
答案 2 :(得分:1)
这有效:
d1 <- head(iris) # dataframe 1 ----------
var <- c("var1", "var2", "var3")
val <- c(5, 7, 1)
d2 <- as.data.frame(cbind(var, val))
for (i in 1:nrow(d2)){
d1[[as.character(d2$var[i])]] <- rep(d2$val[i],nrow(d1))
}
我想有一些方法可以在没有for循环的情况下完成它。我预计很快就会有大枪到达并减少到一行:)。
答案 3 :(得分:1)
以下是一些转置d2
的方法:
d3 <- d2["val"]; rownames(d3) <- d2[,"var"]
cbind(d1,t(d3))
d4 <- do.call(data.frame,setNames(as.list(d2$val),d2$var))
cbind(d1,d4)
dlist5 <- setNames(as.list(d2$val),d2$var)
do.call(data.frame,c(d1,dlist5))
在所有这些情况下,val
仍然是一个字符串,这不是很好。从val
和var
...
cbind(d1,t(data.frame(val,row.names=var)))
答案 4 :(得分:0)
您也可以使用tidyr包。 不过,它对我很有用。
library("tidyr")
# transform to new columns
df <- spread(d2, var, val, convert = T)
df[1,] <- df[!is.na(df)]
df <- df[1, ]
# combine columns
result <- d1 %>% cbind(df)