많은 열을 포함하는 큰 데이터 프레임이 있지만 관련 항목은 ID (주제에 할당 된 번호), 시간 (이 주제를 측정 한 시간) 및 농도입니다. 매우 간단한 예는 다음과 같습니다.
df <- data.frame( ID=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3),
Concentration=c("XXX",0.3,0.7,0.6,"XXX","XXX",0.8,0.3,"XXX","XXX",
"XXX",0.6,0.1,0.1,"XXX"),
Time=c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5))
나는 대체하려는 경우에만 다음과 같은 조건에 따라 열 농도에서 "XXX"값 :
mutate_at 및 replace_na, 일부 ifelse 문 및 case_when을 시도했지만 올바르게 수행하는 방법을 알아낼 수없는 것 같습니다. 어떤 도움이라도 대단히 감사하겠습니다!
편집 : 작업을 보여주기 위해 :
df[df == "XXX" & df$Time<3] <- as.numeric(0)
df[df == "BLQ" & df$Time>3] <- as.character("Missing")
나는 내 문제의 처음 두 부분을 처리하는 간단하고 강력한 해결책을 찾았다. 내가 붙어있는 것은 마지막 부분이다.-시간 이후에 하나의 주제에 대해 두 개 이상의 연속적인 "XXX"값이있을 때> 삼. 나는 ifelse 문을 반복하고 ID 또는 이와 비슷한 목록을 색인화해야한다고 생각하지만 어떻게하는지 알아낼 수 없습니다. 하나의 ID의 최종 농도와 다음 ID의 첫 번째 농도로 "XXX"가있을 수 있기 때문에 여기에서 ID를 분리하는 것이 매우 중요합니다.이 값을 다음에 대한 두 개의 연속 "XXX"값으로 읽지 않기를 바랍니다. 단일 ID.
나는 tidyverse의 몇 가지 기능을 사용하여 그것을 해결했고, 또한 당신의 예제에 다른 레코드를 추가했습니다.
rm(list = ls(all=TRUE))
require(tidyverse)
df <- data.frame( ID=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3),
Concentration=c("XXX",0.3,0.7,0.6,"XXX","XXX",0.8,0.3,"XXX","XXX",
"XXX",0.6,0.1,0.1,"XXX",0.2,"XXX","XXX",1),
Time=c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,6,7,8,9))
df <- tibble(df) %>%
mutate(Concentration = as.character(Concentration),
Concentration_Original = Concentration) %>%
mutate(Concentration = ifelse(Concentration == 'XXX' & Time <= 3, "0", Concentration)) %>%
group_by(ID) %>%
mutate(Concentration = ifelse(Concentration == 'XXX' & Concentration == lead(Concentration),
"0.05", ifelse(Concentration == 'XXX',
"Missing", Concentration))) %>%
replace_na(list(Concentration = "Missing")) %>% ungroup()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다