r - 如何在一个数据框中提取特定条目并将它们放入另一个空白数据框中?
问题描述
我有两个数据框(出于这个问题的目的,我创建了一些虚拟的。真实的要大得多)。第一个有我需要的所有数据:
df1 <- data.frame("id" = c(1, 1, 1, 1, 2, 2, 3, 3, 3, 3),
"Label" = c("Bonds", "Cash", "Stock", "Equity", "Cash", "Bonds",
"Bonds", "Cash", "Equity", "Stock"),
"Value" = c(.25, .25, .30, .20, .60, .40, .10, .40, .20, .30))
第二个是空白数据框。
df2 <- data.frame(matrix(ncol = 3, nrow = 4))
我的目标:df2 中的每一列都应该与一个“id”相关联,每一行应该代表一个“标签”。df2 的条目应该是各自的“值”。在此示例中,代码运行后 df2 应如下所示:
1 2 3
Bonds .25 .40 .10
Cash .25 .60 .40
Stock .30 NA .30
Equity .20 NA .20
这是我到目前为止所拥有的。我创建了一个具有唯一“id”的向量:
id <- unique(df1$id)
然后我创建了一个看起来很难看的嵌套 for 循环,它似乎不起作用:
for (i in length(id)){
for (j in 4){
if (df1$id[j] == id[i] & df1$Label[j] == "Bonds"){
df2[1, i] <- df1[j, 3]
}
else if (df1$id[j] == id[i] & df1$Label[j] == "Cash"){
df2[2, i] <- df1[j, 3]
}
else if (df1$id[j] == id[i] & df1$Label[j] == "Stock"){
df2[2, i] <- df1[j, 3]
}
else if (df1$id[j] == id[i] & df1$Label[j] == "Equity"){
df2[2, i] <- df1[j, 3]
}
}
}
运行此代码不会改变任何内容。我没有收到任何错误。我这样做是最糟糕的方式吗?为什么丑陋的嵌套 for 循环不做任何事情?
解决方案
spread
从包中使用tidyr
可能更容易。
spread(df1, id, Value)
Label 1 2 3
1 Bonds 0.25 0.4 0.1
2 Cash 0.25 0.6 0.4
3 Equity 0.20 NA 0.2
4 Stock 0.30 NA 0.3
这是您固定的丑陋循环和一些评论。
- 您的 for 函数只有一个值(长度(id)和 4)。如果要循环,则需要多个值(例如 1:length(id) 或 1:4)。您的循环只是查看了 df1 (1 - Equity - 0.2) 的第 4 行,并将其与 id 3 进行了比较。如果 id1 == id3 的条件不匹配。因此,您的循环什么也没做。
- 由于您的第二个 else if,您覆盖了同一列 (df2[2, i])。
- 您的 for-function 需要遍历整个 df1。你的 j 停得太早了。
id <- unique(df1$id)
df2 <- data.frame(matrix(ncol = 3, nrow = 4))
colnames(df2) <- id
rownames(df2) <- c("Bonds", "Cash", "Stock", "Equity")
for (i in 1:length(id)){
for (j in 1:nrow(df1)){
if (df1$id[j] == id[i] & df1$Label[j] == "Bonds"){
df2[1, i] <- df1[j, 3]
}
else if (df1$id[j] == id[i] & df1$Label[j] == "Cash"){
df2[2, i] <- df1[j, 3]
}
else if (df1$id[j] == id[i] & df1$Label[j] == "Stock"){
df2[3, i] <- df1[j, 3]
}
else if (df1$id[j] == id[i] & df1$Label[j] == "Equity"){
df2[4, i] <- df1[j, 3]
}
}
}
推荐阅读
- java - 访问 (JUnit) Localstack 日志
- kotlin - 将 println 用于类实例时,Kotlin 奇怪的输出
- c# - 如何在泛型类型之间进行转换
- c# - 为什么 nameof 不能与 CreationAtAction return 语句一起使用
- c# - 如何计算列表中的每个整数单独的整数
- git - Git pull - 设备上没有剩余空间错误,剩余可用空间
- python - Python 2.7:根据 2 个字典列表中的一个键值查找常用元素
- pyspark - 与 show 方法或计数一起使用时,jupyter 单元执行挂起并引发异常
- javascript - Vuex中数组对象的反应式设置器的最佳实践是什么?
- deep-learning - 可以在两个权重矩阵之间添加非线性函数吗?