我正在使用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
所以我知道我只需要添加空行长度的零即可,但是在搜索中找不到答案。
答案 0 :(得分:2)
您正在做的是提取符合条件的数据(1767行),因此矢量要短于数据框中的行数。
您应该改用“ ifelse”。
data$M1 <- ifelse(data$Mw > 6.5,
data$Mw - 6.5,
0)
如果数字大于6.5,则从数字中减去6.5,否则返回零。
答案 1 :(得分:0)
这应该做您想要的:
data$M1[1768:20071] <- 0
或者,如果M1是另一个数据帧的单独矢量或列:
data$M1 <- c(M1, rep(0, 20071-1768))
答案 2 :(得分:0)
使用cbind.fill()
库中的rowr
,我们可以绑定不同大小的数据帧/向量,同时用所需的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
答案 3 :(得分:0)
另一种基本的R方法是先创建填充有零的列,然后再使用逻辑索引。
data$M1 <- 0
data$M1[data$Mw > 6.5] <- data$Mw[data$Mw > 6.5] - 6.5
这可能更快。
答案 4 :(得分:0)
您可以这样做:
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()
快得多。