조건부 (`if`) 문을 기반으로 데이터 프레임의 값을 바꿉니다.
아래에 코딩 된 R 데이터 프레임에서로 B
나타나는 모든 시간을 바꾸고 싶습니다 b
.
junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12])
colnames(junk) <- c("nm", "val")
이것은 다음을 제공합니다.
nm val
1 A a
2 B b
3 C c
4 D d
5 A e
6 B f
7 C g
8 D h
9 A i
10 B j
11 C k
12 D l
나의 초기 시도는 다음 for
과 if
같이 and 문 을 사용하는 것이었다 .
for(i in junk$nm) if(i %in% "B") junk$nm <- "b"
그러나 당신이 볼 수 있듯이 이것은 모든 값을 junk$nm
로 바꿉니다 b
. 이것이 왜 이런 일을하는지 알 수 있지만 원래 값이였던 junk $ nm의 경우 만 대체 할 수는 없습니다 B
.
참고 : 나는 문제를 해결 gsub
했지만 RI를 배우기 위해 원래의 접근법을 작동시키는 방법을 알고 싶습니다 (가능한 경우)
nm를 문자로 쉽게 변환 한 다음 변경하십시오.
junk$nm <- as.character(junk$nm)
junk$nm[junk$nm == "B"] <- "b"
편집 : 그리고 실제로 nm를 요인으로 유지 해야하는 경우 이것을 끝에 추가하십시오.
junk$nm <- as.factor(junk$nm)
값을 대체하는 또 다른 유용한 방법
library(plyr)
junk$nm <- revalue(junk$nm, c("B"="b"))
짧은 대답은 다음과 같습니다.
junk$nm[junk$nm %in% "B"] <- "b"
R 소개의 색인 벡터를 살펴보십시오 (아직 읽지 않은 경우).
편집하다. 주석에서 알 수 있듯이이 솔루션은 문자 벡터에 작동하므로 데이터가 실패합니다.
가장 좋은 방법은 레벨을 변경하는 것입니다.
levels(junk$nm)[levels(junk$nm)=="B"] <- "b"
표시하는 데이터가 요인이므로 약간 복잡합니다. @diliop의 답변 nm
은 문자 변수 로 변환하여 문제에 접근합니다 . 원래 요소로 돌아가려면 추가 단계가 필요합니다.
대안은 적절한 요소 수준을 조작하는 것입니다.
> lev <- with(junk, levels(nm))
> lev[lev == "B"] <- "b"
> junk2 <- within(junk, levels(nm) <- lev)
> junk2
nm val
1 A a
2 b b
3 C c
4 D d
5 A e
6 b f
7 C g
8 D h
9 A i
10 b j
11 C k
12 D l
그것은 매우 간단하며에 대한 대체 함수가 있다는 것을 종종 잊습니다 levels()
.
Edit: As noted by @Seth in the comments, this can be done in a one-liner, without loss of clarity:
within(junk, levels(nm)[levels(nm) == "B"] <- "b")
The easiest way to do this in one command is to use which
command and also need not to change the factors into character by doing this:
junk$nm[which(junk$nm=="B")]<-"b"
You have created a factor variable in nm
so you either need to avoid doing so or add an additional level to the factor attributes. You should also avoid using <-
in the arguments to data.frame()
Option 1:
junk <- data.frame(x = rep(LETTERS[1:4], 3), y =letters[1:12], stringsAsFactors=FALSE)
junk$nm[junk$nm == "B"] <- "b"
Option 2:
levels(junk$nm) <- c(levels(junk$nm), "b")
junk$nm[junk$nm == "B"] <- "b"
junk
If you are working with character variables (note that stringsAsFactors
is false here) you can use replace:
junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12], stringsAsFactors = FALSE)
colnames(junk) <- c("nm", "val")
junk$nm <- replace(junk$nm, junk$nm == "B", "b")
junk
# nm val
# 1 A a
# 2 b b
# 3 C c
# 4 D d
# ...
stata.replace<-function(data,replacevar,replacevalue,ifs) {
ifs=parse(text=ifs)
yy=as.numeric(eval(ifs,data,parent.frame()))
x=sum(yy)
data=cbind(data,yy)
data[yy==1,replacevar]=replacevalue
message=noquote(paste0(x, " replacement are made"))
print(message)
return(data[,1:(ncol(data)-1)])
}
Call this function using below line.
d=stata.replace(d,"under20",1,"age<20")
'program story' 카테고리의 다른 글
AngularJS-$ anchorScroll 부드러운 / 지속 시간 (0) | 2020.07.27 |
---|---|
GitLab CI 및 Jenkins (0) | 2020.07.27 |
Java에서 메소드를 분리하거나 종료하는 방법은 무엇입니까? (0) | 2020.07.26 |
html 그룹에서 하나의 확인란 만 선택 (0) | 2020.07.26 |
AJAX Mailchimp 가입 양식 통합 (0) | 2020.07.26 |