r - 将前一个匹配行的值复制到新的匹配行
问题描述
我的示例数据框构造如下:
ID <- c("1", "2", "1", "2", "1", "2")
Current <- c(1.12, NA, 3.66, 8.95, 4.73, 7.82)
Previous <- c(NA, NA, NA, NA, NA, NA)
df <- data.frame(ID, Current, Previous, stringsAsFactors = TRUE)
通过写入ID
结果添加额外内容:levels(df$ID)
levels(df$ID) <- c(levels(df$ID), "3")
> levels(df$ID)
[1] "1" "2" "3"
(我正在添加一个额外的级别,因为我当前使用的数据框包含许多甚至不会出现一次的级别。)
现在写df
打印:
ID Current Previous
1 1 1.12 NA
2 2 NA NA
3 1 3.66 NA
4 2 8.95 NA
5 1 4.73 NA
6 2 7.82 NA
因为typeof(df$Current)
is"double"
和typeof(df$Previous)
is "logical"
,我想将该Previous
列转换为"double"
. 为了实现这一点,我写:
df$Previous <- as.numeric(as.character(df$Previous))
现在写入typeof(df$Previous)
会导致"double"
.
我现在想做ID 1
以下事情:如果值不是. 也就是说,结果表应如下所示:Current
ID 1
Previous
Current
NA
ID Current Previous
1 1 1.12 NA
2 2 NA NA
3 1 3.66 1.12
4 2 8.95 NA
5 1 4.73 3.66
6 2 7.82 8.95
我已经尝试通过编写以下for
循环来做到这一点,但它不起作用,我不知道我做错了什么:
i = 1
for(i in length(unique(df$ID))) {
j = 1
k = 1
idLocationAbsolute = 1
for(j in length(df$ID)) {
if(unique(df$ID)[i] == df$ID[j]) {
idLocationAbsolute[k] = j
k = k + 1
}
}
if(k > 1) {
k = k - 1
l = 1
for(l in k) {
if(!is.na(idLocationAbsolute[l])) {
df$Previous[l + 1] = df$Current[l]
}
}
}
}
请注意,我之所以写idLocationAbsolute = 1
是因为 R 会打印错误消息。但我无法判断这是否是一件好事,或者它是否只是破坏了整个代码。然而,我认为这不是代码没有做它应该做的事情的原因。
解决方案
推荐阅读
- java - 在 Java 中计算字符串的 1 和 0,并将它们按顺序排列?
- c++ - 如何在不共享源的情况下分发 fw 模块
- java - 在 Testng 测试中使用来自 Spring Cloud 配置服务器的数据不起作用
- powerbi - 使用自定义总计进行测量 (PowerBI - DAX)
- python - Dask中逗号分隔列的虚拟/一热编码
- graphql - 如何在 POSTMAN 中为 GraphQL 文件上传定义操作映射
- python - 尝试将 Flask 与 Pycharm 用于具有 localhost 的 API 时出错
- c# - 为什么 foreach 在 C# 中分配 int 数组?
- python - 如何在 Django 问卷中显示图像
- swift - 将 SwiftUi View 作为图像保存到相册