【发布时间】:2017-07-21 14:22:02
【问题描述】:
在编写一个计算向量中每个观察值的函数时,我如何引用所述观察值以包含与当前正在操作的观察值相距预定数量的观察值的单元格?如果每一行都是i,使得i = 1、2、...等,我如何引用第i-1行的列?
这是一个模仿我的困境的示例数据集:
> letters <- c('a', 'b', 'c', 'b', 'e')
> numbers <- c('1', '', '2', '', '3')
> sample <- cbind(letters, numbers)
> sample
letters numbers
[1,] "a" "1"
[2,] "b" ""
[3,] "c" "2"
[4,] "b" ""
[5,] "e" "3"
我想用之前观察到的sample$numbers 中的值填充sample$numbers 中的每个空单元格。我如何引用在其创建过程中创建的观察?例如,我尝试过:
> sample$numbers <- ifelse(sample$numbers == "", sample$numbers[as.numeric(rownames(sample)) - 1], sample$numbers)
Error in sample$numbers : $ operator is invalid for atomic vectors
我也尝试过在sample$letters 中使用常见的b 来填充缺失值:
> f1 <- function(df, cols, match_with, to_x = 'b'){
+ df[cols] <- lapply(df[cols], function(i)
+ ifelse(grepl(to_x, match_with, fixed = TRUE), sample$numbers[as.numeric(rownames(sample)) - 1],
+ i))
+ return(df)
+ }
> sample = f1(sample, cols = c('numbers'), match_with = sample$letters)
Hide Traceback
Rerun with Debug
Error in sample$letters : $ operator is invalid for atomic vectors
5.
grepl(to_x, match_with, fixed = TRUE)
4.
ifelse(grepl(to_x, match_with, fixed = TRUE), sample$numbers[as.numeric(rownames(sample)) -
1], i)
3.
FUN(X[[i]], ...)
2.
lapply(df[cols], function(i) ifelse(grepl(to_x, match_with, fixed = TRUE),
sample$numbers[as.numeric(rownames(sample)) - 1], i))
1.
f1(sample, cols = c("numbers"), match_with = sample$letters)
在这两种情况下,我的问题似乎是我在之前的观察中使用sample$numbers[as.numeric(rownames(sample)) - 1] 来引用sample$numbers 的值。有没有更好的方法来做到这一点?
【问题讨论】:
-
$仅适用于list或data.frame,不适用于matrix。您可以使用sample[, 2]或sample[, "numbers"]引用该列。我会尝试:sample[, 2] <- ifelse(sample[, 2] == '', c('', head(sample[, 2], -1)), sample[, 2]). -
看看
FillDown包中的FillDown函数。这是link
标签: r function if-statement missing-data rowname