作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
抱歉,对于较长的对象长度不是较短的对象长度的倍数的问题,我找不到正确的答案我有一个这样的数据框
dt = data.frame(id = c(1,2,3,4,5), A=c('a', 'a', 'c', 'b','b'), B= c('d', 'd','h', 'd', 'd'))
我想得到
id A B final
1 1 a d <NA>
2 2 a d d
3 3 c h c
4 4 b d b
5 5 b d d
我愿意
dt$A = ifelse(dt$A[dt$id] == dt$A[dt$id-1], as.character(dt$B[dt$id-1]), as.character(dt$A))
Warning message:
In dt$A[dt$id] == dt$A[dt$id - 1] :
longer object length is not a multiple of shorter object length
我可以
shift <- function(x, n){
c(x[-(seq(n))], rep(NA, n))
}
dt$sht <- shift(as.character(dt$A), 1)
dt$new = ifelse(dt$sht == dt$A, as.character(dt$B), as.character(dt$A[dt$id+1]))
temp = dt$new
temp=append(NA, temp)
temp = temp[-6]
dt$final = temp
dt[, c(1,2,3,6)]
id A B final
1 1 a d <NA>
2 2 a d d
3 3 c h c
4 4 b d b
5 5 b d d
不过路途遥远,我想你可以改正公式中的错误
dt$A = ifelse(dt$A[dt$id] == dt$A[dt$id-1], as.character(dt$B[dt$id-1]), as.character(dt$A))
或者,如果有任何更方便、更快捷的方式,我将不胜感激。
最佳答案
R
中的索引从 1 开始。当我们取 dt$id -1
时,对于 'id =1,它变为 0 并返回索引
dt$A[0]
#character(0)
导致 ifelse
的不同参数的 length
不同。
ifelse(test, yes, no)
If yes or no are too short, their elements are recycled. yes will be evaluated if and only if any element of test is true, and analogously for no.
相反,我们可以利用lag
library(dplyr)
dt %>%
mutate(final = case_when(A == lag(A, default = A[1]) ~ lag(B), TRUE ~ A))
# id A B final
#1 1 a d <NA>
#2 2 a d d
#3 3 c h c
#4 4 b d b
#5 5 b d d
这里也可以换成ifelse
,根据?case_when
This function allows you to vectorise multiple if_else() statements.
dt = data.frame(id = c(1,2,3,4,5), A=c('a', 'a', 'c', 'b','b'),
B= c('d', 'd','h', 'd', 'd'), stringsAsFactors = FALSE)
注意:stringsAsFactors = TRUE
,默认情况下。通过将其更改为FALSE
,可以避免在创建数据集后进行多次as.character
转换
关于r - 按条件更改数据框中的值 : longer object length is not a multiple of shorter object length,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894067/
我是一名优秀的程序员,十分优秀!