【发布时间】:2021-03-27 09:32:14
【问题描述】:
我有一个可以通过 for 循环轻松解决的问题。但是,由于我在数据框中有十万行,这将花费很长时间的计算时间,因此我正在寻找一种快速而智能的解决方案。
对于我的数据框中的每一行,我想粘贴列名与第一列(索引)中的列名匹配的单元格的值
数据框是这样的
> mydata
INDEX 1 2 3 4 5 6
1 2 18.9 9.5 22.6 4.7 16.2 7.4
2 2 18.9 9.5 22.6 4.7 16.2 7.4
3 2 18.9 9.5 22.6 4.7 16.2 7.4
4 4 18.9 9.5 22.6 4.7 16.2 7.4
5 4 18.9 9.5 22.6 4.7 16.2 7.4
6 5 18.9 9.5 22.6 4.7 16.2 7.4
这是重现它的代码:
mydata <- data.frame(INDEX=c(2,2,2,4,4,5), ONE=(rep(18.9,6)), TWO=(rep(9.5,6)),
THREE=(rep(22.6,6)), FOUR=(rep(4.7,6)), FIVE=(rep(16.2,6)), SIX=(rep(7.4,6)))
colnames(mydata) <- c("INDEX",1,2,3,4,5,6)
这是带有新计算变量的新数据框:
> new_mydf
INDEX 1 2 3 4 5 6 VARIABLE
3 2 18.9 9.5 22.6 4.7 16.2 7.4 9.5
2 2 18.9 9.5 22.6 4.7 16.2 7.4 9.5
1 2 18.9 9.5 22.6 4.7 16.2 7.4 9.5
5 4 18.9 9.5 22.6 4.7 16.2 7.4 4.7
4 4 18.9 9.5 22.6 4.7 16.2 7.4 4.7
6 5 18.9 9.5 22.6 4.7 16.2 7.4 16.2
我在下面使用 for 循环解决了它,但是,正如我上面写的,我正在寻找一个更直接的解决方案(也许使用 dplyr 之类的包或其他函数?),因为循环对我的扩展数据集
id = mydata$INDEX
new_mydf <- data.frame()
for (i in 1:length(id)) {
mydata_row <- mydata[i,]
value <- mydata_row$INDEX
mydata_row["VARIABLE"] <- mydata_row[,names(mydata_row) == value]
new_mydf <- rbind(mydata_row,new_mydf)
}
new_mydf <- new_mydf[ order(new_mydf[,1]), ]
【问题讨论】:
-
有了data.table,有这个:stackoverflow.com/q/33310179
-
谢谢,使用 data.table 的解决方案效果很好!
标签: r dataframe dplyr apply sapply