我正在使用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.5
和0
。
这正是函数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
这可能更快。