r - 如何解决 R 中的矢量化问题?
问题描述
R新手(ish)。我已经编写了一些在 R 中使用for()
循环的代码。我想以矢量化形式重写它,但它不起作用。
用于说明的简化示例:
library(dplyr)
x <- data.frame(name = c("John", "John", "John", "John", "John", "John", "John", "John", "Fred", "Fred"),
year = c(1, NA, 2, 3, NA, NA, 4, NA, 1, NA))
## if year is blank and name is same as name from previous row
## take year from previous row
## else
## stick with the year you already have
# 1. Run as a loop
x$year_2 <- NA
x$year_2[1] <- x$year[1]
for(row_idx in 2:10)
{
if(is.na(x$year[row_idx]) & (x$name[row_idx] == x$name[row_idx - 1]))
{
x$year_2[row_idx] = x$year_2[row_idx - 1]
}
else
{
x$year_2[row_idx] = x$year[row_idx]
}
}
# 2. Attempt to vectorise
x <- data.frame(name = c("John", "John", "John", "John", "John", "John", "John", "John", "Fred", "Fred"),
year = c(1, NA, 2, 3, NA, NA, 4, NA, 1, NA))
x$year_2 <- ifelse(is.na(x$year) & x$name == lead(x$name),
lead(x$year_2),
x$year)
我认为矢量化版本被搞砸了,因为它有一个循环性(即x$year_2
出现在 的两侧<-
)。有没有办法解决这个问题?
谢谢你。
解决方案
我建议你使用已经建立的功能,R一开始感觉很难,因为我们被训练去重新发明轮子,不要这样做。
library(tidyverse)
x <- data.frame(name = c("John", "John", "John", "John", "John", "John", "John", "John", "Fred", "Fred"),
year = c(1, NA, 2, 3, NA, NA, 4, NA, 1, NA))
x %>%
group_by(name) %>%
tidyr::fill(year)
推荐阅读
- javascript - 在javascript中的函数之间共享变量
- java - 无法解决“javac 错误:包不存在”
- cocoapods - Cocoapods curl: (22) The requested URL returned error: 403 Forbidden
- node.js - 安装 npm 私有包会返回 404/405 - “不在 npm 注册表中”
- javascript - JavaScript - 计算 div 中的字符数并在其中跳过标签
- c# - 将 json 数组(无键)映射到类对象 C#
- java - ArrayAdapter 未在 ListView、Android Studio 中显示添加的元素
- postgresql - 发送电子邮件的 shell 脚本中的问题
- javascript - 别名 - discord.js
- web - Web 浏览器首选项中语言标签的语义是什么?