gpt4 book ai didi

r - 按条件更改数据框中的值 : longer object length is not a multiple of shorter object length

转载 作者:行者123 更新时间:2023-12-02 00:51:55 28 4
gpt4 key购买 nike

抱歉,对于较长的对象长度不是较短的对象长度的倍数的问题,我找不到正确的答案我有一个这样的数据框

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com