이것은 나의 첫 번째 게시물입니다.
각 행에 대해 단계별 비모수 테스트를 수행하려는 4 개의 데이터 프레임이 있습니다.
예 : 데이터 프레임 A의 각 행 값을 데이터 프레임 B의 각 행 값과 비교하고 싶습니다.
예를 들어 비 매개 변수 테스트가 필요합니다. 윌 콕슨이나 뭐든지.
중간 값으로 새로운 칼럼을 만들려고했지만 더 나은 것이 있다고 확신합니다.
이 작업을 수행하는 방법을 알려 주시겠습니까?
미리 감사드립니다!
편집 : 여기 내 가상 데이터 프레임이 있습니다.
각 데이터 프레임을 행 단위로 비교하고 싶습니다. 예를 들어 데이터 프레임 A와 B에서 John에 대한 비모수 테스트를 수행 한 다음 Dora 등에 대해 수행합니다.
A <- data.frame("A" = c("John","Dora","Robert","Jim"),
"A1" = c(8,1,10,5),
"A2"= c(9,1,1,4))
B <- data.frame("B" = c("John","Dora","Robert","Jim"),
"B1" = c(1,1,1,5),
"B2"= c(3,2,1,5),
"B3"=c(4,3,1,5),
"B4"=c(6,8,8,1))
나는 당신이 기능 wilcox.test
( stats
패키지)을 찾고 있다고 생각합니다 .
해결 방법 1 : for loop
A의 각 행을 B의 해당 행과 비교하고 p 값을 추출하는 한 가지 방법은 다음 for loop
과 같이 만드는 것입니다 .
pval = NULL
for(i in 1:nrow(A))
{
vec_a = as.numeric(A[i,2:ncol(A)])
vec_b = as.numeric(B[B$B == A$A[i],2:ncol(B)])
p <- wilcox.test(vec_a,vec_b)
pval = c(pval, p$p.value)
print(p)
}
마지막 pval
으로 각 행에 대한 pvalue를 포함 하는 벡터 를 얻습니다 .
pval
[1] 0.1333333 0.2188194 0.5838824 1.0000000
해결 방법 2 : 사용 tidyverse
보다 우아한 솔루션은 tidyverse
패키지 (특히 dplyr
및 tidyr
)를 사용하여 데이터 프레임을 단일 프레임으로 어셈블하고 함수에 수식을 전달하여 각 이름을 그룹별로 비교하는 것 wilcox.test
입니다.
먼저 다음에서 left_join
함수를 사용하여 이름별로 데이터 프레임을 병합 할 수 있습니다 dplyr
.
library(dplyr)
DF <- left_join(A,B, by = c("A"="B"))
A A1 A2 B1 B2 B3 B4
1 John 8 9 1 3 4 6
2 Dora 1 1 1 2 3 8
3 Robert 10 1 1 1 1 8
4 Jim 5 4 5 5 5 1
그런 다음 dplyr
및 tidyr
패키지를 사용 하여 데이터 프레임을 더 긴 형식으로 재구성 할 수 있습니다.
library(dplyr)
library(tidyr)
DF %>% pivot_longer(., -A, names_to = "var", values_to = "values")
# A tibble: 24 x 3
A var values
<fct> <chr> <dbl>
1 John A1 8
2 John A2 9
3 John B1 1
4 John B2 3
5 John B3 4
6 John B4 6
7 Dora A1 1
8 Dora A2 1
9 Dora B1 1
10 Dora B2 2
# … with 14 more rows
var 열의 값에 따라 A 또는 B를 나타내는 새 열 "그룹"을 생성합니다.
DF %>% pivot_longer(., -A, names_to = "var", values_to = "values") %>%
mutate(group = gsub("\\d","",var))
# A tibble: 24 x 4
A var values group
<fct> <chr> <dbl> <chr>
1 John A1 8 A
2 John A2 9 A
3 John B1 1 B
4 John B2 3 B
5 John B3 4 B
6 John B4 6 B
7 Dora A1 1 A
8 Dora A2 1 A
9 Dora B1 1 B
10 Dora B2 2 B
# … with 14 more rows
마지막으로 각 이름에 대해 각 그룹의 값을 비교할 때 A
함수의 p 값을 얻기 위해 데이터 프레임을 그룹화 하고 요약 할 수 있습니다 wilcox.test
.
DF %>% pivot_longer(., -A, names_to = "var", values_to = "values") %>%
mutate(group = gsub("\\d","",var)) %>%
group_by(A) %>%
summarise(Pval = wilcox.test(values~group)$p.value)
# A tibble: 4 x 2
A Pval
<fct> <dbl>
1 Dora 0.219
2 Jim 1
3 John 0.133
4 Robert 0.584
더 길어 보이지만 (특히 각 단계를 설명하기 때문에) 마지막에는 첫 번째 솔루션보다 더 적은 줄이 필요하다는 것을 알 수 있습니다.
귀하의 질문에 대한 답변이 있습니까?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다