将自定义函数应用于每行仅使用参数的第一个值

阿齐吉

我正在尝试使用以下数据集将NA重新编码0为列的子集:

set.seed(1)
df <- data.frame(
  id = c(1:10),
  trials = sample(1:3, 10, replace = T),
  t1 = c(sample(c(1:9, NA), 10)),
  t2 = c(sample(c(1:7, rep(NA, 3)), 10)),
  t3 = c(sample(c(1:5, rep(NA, 5)), 10))
  )

每行都有与之相关的一定次数的试验(在1-3之间),由trials指定t1-t3代表每个试验的分数。

试用次数表示NA应将s编码为的列的子集0NA在试用次数之内的s表示缺少数据,应将其重新编码为0,而NA在试用次数之外的s没有意义,应保留NAs 。因此,对于其中的行trials == 3NAin列t3将被重新编码为0,但是对于其中的行trials == 2NAint3将保留为NA

因此,我尝试使用此功能:

replace0 <- function(x, num.sun) {
  x[which(is.na(x[1:(num.sun + 2)]))] <- 0
  return(x)
}

这对于单个向量效果很好。当我尝试使用将相同的功能应用于数据框时apply()

apply(df, 1, replace0, num.sun = df$trials)

我收到警告说:

In 1:(num.sun + 2) :
  numerical expression has 10 elements: only the first used

结果是,与其根据中的值来num.sun改变每一行的值trialsapply()不如trials对每一行使用列中的第一个值我如何应用该函数,以使num.sun参数根据的值而变化df$trials

谢谢!

编辑:正如一些评论所述,原始示例数据具有一些非NA得分,根据试验列,这些得分没有意义。这是一个更正的数据集:

df <- data.frame(
  id = c(1:5),
  trials = c(rep(1, 2), rep(2, 1), rep(3, 2)),
  t1 = c(NA, 7, NA, 6, NA),
  t2 = c(NA, NA, 3, 7, 12),
  t3 = c(NA, NA, NA, 4, NA)
)
夏普

另一种方法:

# create an index of the NA values
w <- which(is.na(df), arr.ind = TRUE)

# create an index with the max column by row where an NA is allowed to be replaced by a zero
m <- matrix(c(1:nrow(df), (df$trials + 2)), ncol = 2)

# subset 'w' such that only the NA's which fall in the scope of 'm' remain
i <- w[w[,2] <= m[,2][match(w[,1], m[,1])],]

# use 'i' to replace the allowed NA's with a zero
df[i] <- 0

这使:

> df
   id trials t1 t2 t3
1   1      1  3 NA  5
2   2      2  2  2 NA
3   3      2  6  6  4
4   4      3  0  1  2
5   5      1  5 NA NA
6   6      3  7  0  0
7   7      3  8  7  0
8   8      2  4  5  1
9   9      2  1  3 NA
10 10      1  9  4  3

您可以轻松地将其包装在一个函数中:

replace.NA.with.0 <- function(df) {
  w <- which(is.na(df), arr.ind = TRUE)
  m <- matrix(c(1:nrow(df), (df$trials + 2)), ncol = 2)
  i <- w[w[,2] <= m[,2][match(w[,1], m[,1])],]
  df[i] <- 0
  return(df)
}

现在,使用replace.NA.with.0(df)将产生以上结果。


正如其他人所指出的,某些行(1、3和10)的值比尾数更多。您可以通过将上面的函数重写为以下方法来解决该问题:

replace.with.NA.or.0 <- function(df) {
  w <- which(is.na(df), arr.ind = TRUE)
  df[w] <- 0

  v <- tapply(m[,2], m[,1], FUN = function(x) tail(x:5,-1))
  ina <- matrix(as.integer(unlist(stack(v)[2:1])), ncol = 2)
  df[ina] <- NA

  return(df)
}

现在,使用replace.with.NA.or.0(df)产生以下结果:

   id trials t1 t2 t3
1   1      1  3 NA NA
2   2      2  2  2 NA
3   3      2  6  6 NA
4   4      3  0  1  2
5   5      1  5 NA NA
6   6      3  7  0  0
7   7      3  8  7  0
8   8      2  4  5 NA
9   9      2  1  3 NA
10 10      1  9 NA NA

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

tf.py_func ,自定义张量流函数仅应用于张量中的第一个元素

将自定义函数应用于数据框的每个子集并生成一个数据框

将自定义函数应用于 DF 列表,将另一个列表作为输入 - R

使用Python从CSV处理数据,仅将其应用于第一个结果

将自定义函数应用于数据框

将自定义函数应用于数据框

将自定义函数应用于numpy矩阵

如何在python中多次将自定义函数应用于同一个数据帧?

将自定义标记应用于pytest参数化标记的特定值

AngularJS:将自定义过滤器应用于数据时,我得到一个空输出

在使用BIND()将自定义组件方法绑定到组件时,是否可以将第一个参数作为组件本身传递?

如何将自定义函数应用于数据框的每一列

将自定义函数应用于r中的每一行

将自定义函数一次应用于分组的数据帧n行

Shell函数仅使用第一个参数

在模式中使用'current()'函数将自定义模板应用于节点

使用purrr将自定义函数重复应用于相同的数据框

Redux形式的自定义选择不使用第一个值

仅使用CSS将样式应用于段落中的第一个字母

jQuery效果仅应用于第一个元素

仅将CSS应用于第一个孩子并取消继承

Javascript 活动类仅应用于第一个列表项

C#ToolStripProfessionalRender,事件OnRenderItemText仅应用于第一个项目

Puppet 4.10中的自定义函数仅返回哈希中的第一个数组项

将函数应用于组中的第一个元素,然后重新合并

R按一列分组并将自定义函数应用于另一列

按行将自定义函数应用于data.table会返回不正确的值数量

如果列值不等于 nan,则将自定义函数应用于数据框中的列

使用集合存储自定义类时,仅第一个插入有效