gpt4 book ai didi

r - 如何根据列值选择行并在 R 中的大型数据框中以特定方式转换行

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:30 27 4
gpt4 key购买 nike

我正在尝试根据非常具体的标准选择和转换 R 数据框中的一些行,但我不太确定从哪里开始。所以我有一个看起来像这样的数据框:

    ID    t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 gr1 gr2 gr3 gr4
1 0 0 1 0 0 0 2 2 0 0 1 0 0 0
2 1 0 0 0 2 0 2 2 2 2 0 1 0 0
3 1 1 1 2 0 2 2 1 2 0 0 1 0 0
4 0 0 0 1 2 2 1 1 1 0 0 0 0 1
5 2 0 0 1 0 0 1 0 0 0 0 0 1 0

t 列用于时间,或每只动物的再次遭遇场合(唯一 ID#)。

gr 列用于动物所属的组。

时间列下的数据定义了在时间 t 遇到动物的状态。

在我的数据框中,我有从状态 2 到状态 1 的动物,这是正常的,我想保持这种状态。但是,我也有从状态 1 到状态 2 的动物,这是我用来分析数据的程序中没有的。所以我想做的是为从 1 到 2 的每个个体创建一个“虚拟”个体,并将相遇历史分隔为 2。

我需要做的第一件事是将原始行中的所有数据保持一致,直到到达有一个 2 的时间,将这个 2 替换为 1,并将其余的历史替换为 0。我还需要将组标识符的值更改为 -1 而不是 1。所有这些仅适用于从 1 到 2 的历史记录,而不是其他历史记录,即如果我有从 2 到 1 的历史记录,我希望它们保持原样(例如 ID#5)。

接下来,我需要创建一个带有 x' 标识符的新行,它将包含 0 作为历史记录的开始,直到从 1 切换到 2(因此在第一个 2 的时间步),但将包含其余的捕获历史,并将 1 放在与原始行相同的组中。如果从 2 到 1 的转换发生不止一次,则以相同的方式重复转换。所以基本上我想接受这个:

    ID    t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 gr1 gr2 gr3 gr4
1 0 0 1 0 0 0 2 2 0 0 1 0 0 0

并把它变成这样:

    ID    t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 gr1 gr2 gr3 gr4
1 0 0 1 0 0 0 1 0 0 0 -1 0 0 0
1' 0 0 0 0 0 0 2 2 0 0 1 0 0 0

所以如果应用于整个数据框,我想采用:

    ID    t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 gr1 gr2 gr3 gr4
1 0 0 1 0 0 0 2 2 0 0 1 0 0 0
2 1 0 0 0 2 0 2 2 2 2 0 1 0 0
3 1 1 1 2 0 2 2 1 2 0 0 1 0 0
4 0 0 0 1 2 2 1 1 1 0 0 0 0 1
5 2 0 0 1 0 0 1 0 0 0 0 0 1 0

然后把它变成这样:

    ID    t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 gr1 gr2 gr3 gr4
1 0 0 1 0 0 0 1 0 0 0 -1 0 0 0
1' 0 0 0 0 0 0 2 2 0 0 1 0 0 0
2 1 0 0 0 1 0 0 0 0 0 0 -1 0 0
2' 0 0 0 0 2 0 2 2 2 2 0 1 0 0
3 1 1 1 1 0 0 0 0 0 0 0 -1 0 0
3' 0 0 0 2 0 2 2 1 1 0 0 -1 0 0
3'' 0 0 0 0 0 0 0 0 2 0 0 1 0 0
4 0 0 0 1 1 0 0 0 0 0 0 0 0 -1
4' 0 0 0 0 2 2 1 1 1 0 0 0 0 1
5 2 0 0 1 0 0 1 0 0 0 0 0 1 0

我知道这很复杂,我知道我需要如何分离不同的步骤,但我很难弄清楚如何开始第一步,即在数据框中搜索正确的行。挑战来自这样一个事实,即 1 和后面的 2 可以在相邻的列中,或者它们之间有一堆 1 和/或 0。

无论如何,非常感谢您的帮助,如果我可以做些什么来使文本/标题更清晰,请告诉我!

最佳答案

我认为这行得通,可能有更优雅的方法,但行得通:

 ### YOUR DATA
data <- data.frame(ID=c(1:5),t1=c(0,1,1,0,2),t2=c(0,0,1,0,0),t3=c(1,0,1,0,0),t4=c(0,0,2,1,1),t5=c(0,2,0,2,0),t6=c(0,0,2,2,0),t7=c(2,2,2,1,1),t8=c(2,2,1,1,0),t9=c(0,2,2,1,0),t10=c(0,2,0,0,0),gr1=c(1,0,0,0,0),gr2=c(0,1,1,0,0),gr3=c(0,0,0,0,1),gr4=c(0,0,0,1,0))



for(i in 1:length(data$ID)){

bg = which(data[i,2:11]==2)+1 ### Where is there 2?
bg = ifelse(length(bg) == 0,0,min(bg)) ###prevent NA and take 1st occurence of 2
bgg = which(data[i,bg:11]==2) ### Where is there 2 after the first 2?
bgg = c((ifelse(bgg == 0,0,bgg+(bg-1)))) ### Prevent NA
mn = as.numeric(which.max(data[i,2:bg]==1))+1 ### Last one before 2


if((mn-bg) < 0){
### ------- SECOND TASK ------###
### Keep the task in this order if you wanna keep the original history after the 2


n<-nrow(data)+i ### Define a new row
data[n,] = data[i,] ### Paste the data
data[n,2:mn] = 0 ### Put zero before the 2
data[n,1] = paste(i,"'") ### Name the ID'

###------- FIRST TASK -----####

data[i,bgg] = 0 ### DAta after the 2 become 0
data[i,bg] = 1 ### the 2 become 1
data$change[i] = "yes" ### Keep history of change

while(sum(data[i,12:15])>0){
data[i,12] = data[i,12] * -1 ### Negative if change
data[i,13] = data[i,13] * -1
data[i,14] = data[i,14] * -1
data[i,15] = data[i,15] * -1
}}

else if((mn-bg)>=0){
data$change[i] = "no" ### Keep history of no change
}
}


dummies<-subset(data, data$change=="yes")

希望这是你想要的:)

胜利的旅鼠

关于r - 如何根据列值选择行并在 R 中的大型数据框中以特定方式转换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43328886/

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