R에서 이름으로 지정된 벡터/리스트의 하위 집합 설정 및 일치하지 않는 범주 유지
R에서 이름으로 지정된 벡터/리스트의 하위 집합 설정 및 일치하지 않는 범주 유지
벡터/리스트 하위 집합 설정
R에서 벡터 또는 리스트의 하위 집합을 설정하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 다음과 같습니다.
1 [ 연산자 사용
[
연산자를 사용하여 벡터 또는 리스트의 특정 요소를 선택할 수 있습니다. 예를 들어 다음 코드는 벡터 x
의 첫 번째와 세 번째 요소를 선택합니다.
x <- c(1, 2, 3, 4, 5)
y <- x[c(1, 3)]
print(y)
# [1] 1 3
2 names() 함수 사용
names()
함수를 사용하여 벡터 또는 리스트의 이름을 가져올 수 있습니다.
names(x)
# [1] "a" "b" "c" "d" "e"
3 subset() 함수 사용
subset(x, x > 2)
# [[1]]
# [1] 3 4 5
일치하지 않는 범주 유지
위의 방법을 사용하면 원하는 하위 집합을 설정할 수 있지만 일치하지 않는 범주는 제거됩니다. 일치하지 않는 범주를 유지하려면 다음과 같은 방법을 사용할 수 있습니다.
1 match() 함수 사용
match()
함수를 사용하여 벡터 또는 리스트의 요소가 다른 벡터 또는 리스트에서 일치하는 위치를 찾을 수 있습니다.
x <- c("a", "b", "c", "d", "e")
y <- c("b", "c", "f")
match(y, x)
# [1] 2 3 NA
2 ifelse() 함수 사용
ifelse()
함수를 사용하여 일치하는 요소와 일치하지 않는 요소를 구분할 수 있습니다.
x <- c("a", "b", "c", "d", "e")
y <- c("b", "c", "f")
z <- ifelse(match(y, x) > 0, y, "NA")
print(z)
# [1] "b" "c" "NA"
예시
다음은 이름으로 지정된 벡터/리스트의 하위 집합을 설정하고 일치하지 않는 범주를 유지하는 예시입니다.
# 데이터 준비
names <- c("a", "b", "c", "d", "e")
values <- c(1, 2, 3, 4, 5)
x <- list(names = names, values = values)
# 하위 집합 설정
selected_names <- c("a", "c", "e")
y <- subset(x, names %in% selected_names)
# 일치하지 않는 범주 유지
z <- ifelse(names %in% selected_names, values, "NA")
# 결과 출력
print(y)
# [[1]]
# $names
# [1] "a" "c" "e"
#
# [[1]]
# $values
# [1] 1 3 5
print(z)
# [1] 1 NA 3 NA 5
이 예시에서 x
는 이름과 값을 가진 리스트입니다. selected_names
벡터는 하위 집합에 포함할 이름을 지정합니다. y
는 하위 집합을 포함하는 새 리스트입니다. z
는 일치하는 범주의 값을 포함하고 일치하지 않는 범주의 값은 "NA"로 표시하는 벡터입니다.
예제 코드
# 데이터 준비
names <- c("a", "b", "c", "d", "e")
values <- c(1, 2, 3, 4, 5)
x <- list(names = names, values = values)
# 하위 집합 설정
selected_names <- c("a", "c", "e")
y <- subset(x, names %in% selected_names)
# 일치하지 않는 범주 유지
z <- ifelse(names %in% selected_names, values, "NA")
# 결과 출력
print(y)
# [[1]]
# $names
# [1] "a" "c" "e"
#
# [[1]]
# $values
# [1] 1 3 5
print(z)
# [1] 1 NA 3 NA 5
names
벡터는 리스트의 이름을 저장합니다.x
리스트는names
벡터와values
벡터를 포함합니다.selected_names
벡터는 하위 집합에 포함할 이름을 저장합니다.y
리스트는selected_names
벡터에 지정된 이름에 해당하는 값을 포함하는 하위 집합입니다.z
벡터는names
벡터의 각 이름이selected_names
벡터에 있는지 확인합니다.- 이름이 있으면 해당 이름에 해당하는 값을 저장합니다.
- 이름이 없으면 "NA"를 저장합니다.
결과:
y
리스트는 "a", "c", "e" 이름에 해당하는 값을 포함합니다.z
벡터는 "a", "c", "e" 이름에 해당하는 값은 1, 3, 5이고, "b", "d" 이름에 해당하는 값은 "NA"입니다.
대체 방법
purrr
패키지의 map()
함수를 사용하여 벡터 또는 리스트의 각 요소에 함수를 적용하고 결과를 리스트로 반환할 수 있습니다.
library(purrr)
# 데이터 준비
names <- c("a", "b", "c", "d", "e")
values <- c(1, 2, 3, 4, 5)
x <- list(names = names, values = values)
# 하위 집합 설정 및 일치하지 않는 범주 유지
selected_names <- c("a", "c", "e")
y <- map(names, ~ ifelse(.x %in% selected_names, values[[.x]], "NA"))
# 결과 출력
print(y)
# [[1]]
# [1] 1 NA 3 NA 5
설명:
map()
함수는names
벡터의 각 이름에 대해 다음 함수를 적용합니다.y
리스트는map()
함수의 결과를 저장합니다.
data.frame 사용
data.frame
을 사용하여 이름과 값을 가진 데이터 프레임을 만들 수 있습니다.
# 데이터 준비
names <- c("a", "b", "c", "d", "e")
values <- c(1, 2, 3, 4, 5)
# 하위 집합 설정 및 일치하지 않는 범주 유지
selected_names <- c("a", "c", "e")
df <- data.frame(names = names, values = values)
df <- df[df$names %in% selected_names, ]
df$values[is.na(df$values)] <- "NA"
# 결과 출력
print(df)
# names values
# 1 a 1
# 2 c 3
# 3 e 5
data.frame()
함수를 사용하여names
벡터와values
벡터를 포함하는 데이터 프레임을 만듭니다.subset()
함수를 사용하여names
벡터가selected_names
벡터에 있는지 확인합니다.is.na()
함수를 사용하여values
벡터에서 "NA" 값을 확인합니다.ifelse()
함수를 사용하여 "NA" 값을 "NA" 문자열로 바꿉니다.
for 루프 사용
for
루프를 사용하여 벡터 또는 리스트의 각 요소를 반복적으로 처리할 수 있습니다.
# 데이터 준비
names <- c("a", "b", "c", "d", "e")
values <- c(1, 2, 3, 4, 5)
# 하위 집합 설정 및 일치하지 않는 범주 유지
selected_names <- c("a", "c", "e")
y <- list()
for (i in 1:length(names)) {
if (names[i] %in% selected_names) {
y[[length(y) + 1]] <- values[i]
} else {
y[[length(y) + 1]] <- "NA"
}
}
# 결과 출력
print(y)
# [[1]]
# [1] 1 NA 3 NA 5
r