在 R 中用零填充空行

  • 本文关键字:填充 r dataframe
  • 更新时间 :
  • 英文 :


我正在使用R来准备一个data.frame,稍后将在混合效应回归中使用。我对 R 很陌生,我试图搜索并找到我的问题的解决方案,但我无法准确找到我想要的东西。

我的data.frame有 20071 行,我想添加一个新列,但它的长度为 1767,我需要用零填充其余部分。 代码如下:

data$M1 <- c(data$M1,(data$Mw[(data$Mw > 6.5)]-6.5))

我收到此错误:

Error in `$<-.data.frame`(`*tmp*`, "M1", value = c(0.0999999999999996,  : 

replacement has 1767 rows, data has 20071

所以我知道我只需要添加空行长度的零,但我在搜索中找不到答案。

您正在做的是提取符合您的条件的数据(1767 行),从而提取比数据帧中的行数短的向量。

您应该改用"ifelse"。

data$M1 <- ifelse(data$Mw > 6.5,
data$Mw - 6.5,
0)

如果数字大于 6.5,则从数字中减去 6.5,否则返回零。

你可以这样做:

data$M1 <- pmax(data$Mw - 6.5, 0)

这里的想法如下:你想创建一个包含data$Mw - 6.5除非data$Mw < 6.5的向量,在这种情况下,向量应该为零。这意味着您将在data$Mw - 6.5 < 0时为零。因此,对于每个i,您的向量将包含最大值data$Mw - 6.50

这正是函数pmax()的用途:它接受多个向量作为输入并返回元素最大值。通过一个例子最容易看到这一点:

pmax(c(1, 4), c(3, 2))
[1] 3 4

输出的第一个值对应于max(1, 3)第二个值max(4, 2)

这比使用ifelse()要快得多。

这应该可以做你想要的:

data$M1[1768:20071] <- 0

或者,如果 M1 是另一个数据帧的单独向量或列:

data$M1 <- c(M1, rep(0, 20071-1768))

使用rowr库中的cbind.fill(),我们可以绑定不同大小的数据帧/向量,同时用所需的fill填充孔。

> a=as.data.frame(matrix(0,4,2),stringsAsFactors = FALSE)
> a
V1 V2
1  0  0
2  0  0
3  0  0
4  0  0
> b=c(1,2,3)
> cbind.fill(a,b,fill=0)
V1 V2 object
1  0  0      1
2  0  0      2
3  0  0      3
4  0  0      0

另一种基本 R 方法是先创建用零填充的列,然后使用逻辑索引。

data$M1 <- 0
data$M1[data$Mw > 6.5] <- data$Mw[data$Mw > 6.5] - 6.5

这可能更快。

最新更新