2016-07-03 1 views
0

저는 R을 사용하고 CSV 파일을 읽어 값이 0 인 파일의 열 그룹을 요약하고 알레르기 반응이 있는지 여부를 확인합니다. 이 파일에는 538 개의 변수가 포함되어 있습니다.이 변수는 정수이므로 모든 정수를 요인 변수로 변환하여 내 용도를 해결합니다. 그러나 모든 factor 열의 값을 요약하는 테이블 함수 만 사용할 수 있지만 열을 그룹화하고이를 그룹 요약별로 그룹의 테이블 함수에 적용해야합니다. 아무도이 점에서 나를 도울 수 없습니까? 다음과 같이테이블에 CSV 열의 범위를 추가하는 방법

내 코드는 다음 테이블에

egg1 <-read.csv("egg.csv",header = TRUE) 

str(egg1) 

egg1[sapply(egg1, is.integer)] <- lapply(egg1[sapply(egg1, is.integer)], as.factor) 

lapply(egg1, function(egg1) { 
    if (is.factor(egg1)) return(table(egg1)) 
    }) 

내가 그룹에 의해 CSV 파일 그룹의 변수의 범위를 전달 찾고 있어요 ....입니다. 더 나은 이해를 위해 색칠 한 3 개의 그룹이 들어있는 샘플 CSV를 살펴보십시오. Q1 : 3 가지 증상이 각각 나열되어있는 dose1, dose2 및 dose3에 대한 예/아니오 (1/0)의 분포를 계산하고 싶습니다. Q2 : 3 회 복용량의 증상을 비교하십시오.

테이블은 모든 열의 요약을 보여 주지만 그룹 별 요약이 필요합니다. @alistaire 말했듯이

sample data

+1

그것은 선 아래로 버그를 소개 할 수있는 잠재력을 가지고 같은 요인으로 번호를 설정하는 일반적으로 권할 수있다 : 당신은 두 그룹에 대한 용량symp 필드를 구분하는 컬럼 dose_symp을 분할 할 수 있습니다 인자가 정수로 저장된다는 사실 때문에 매우주의하지 않는 한).만약 당신이 각 컬럼의 테이블을 만들고자한다면,'lapply (egg1, table)'만 있으면된다. – alistaire

+1

거의 각 컬럼을 그룹으로 묶어서 테이블을 만들 필요가있다. 분명히 나는 ​​생년월일과 체중의 예를 들어 몇 개의 기둥을 건너 뛸 필요가있다. 특정 그룹이 csv 파일의 특정 섹션에 속하기 때문에 문제를 그룹화하는 것이 가장 좋습니다. – Usman

+0

CSV에 대해 더 이상 말하지 않고 있습니다. 이제는 data.frame에 대해 이야기하고 있습니다. 정말로,이 시점에서 내가 할 수있는 것은 모두 당신이 필요로하는 것에 대해 추측하는 것입니다. 당신은 최소한 (분명히와 함께하지 않는 방법에 대한 [읽기이] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610)해야합니다. 538 열,하지만 대표적인 하위 집합) 재현 가능 (데이터!) 예제 및 질문을 편집 할 수 있습니다. – alistaire

답변

0

, 우리는 재현 예를 놓치고, 그러나 아마이 충분히 구조와 의도 추측됩니다.

일부 데이터를 조작하겠습니다. 실제 데이터를 밀접하게 연상시키기를 바랍니다. 대신 factor의, 당신이 관심있는 열이 0 중 하나

set.seed(4) 
egg1 <- data.frame(
    v1 = sample(0:1, size=20, replace=TRUE), 
    v2 = sample(0:1, size=20, replace=TRUE), 
    v3 = sample(c('a','b','c'), size=20, replace=TRUE), 
    v4 = sample(0:1, size=20, replace=TRUE), 
    stringsAsFactors = FALSE) 
str(egg1) 
# 'data.frame': 20 obs. of 4 variables: 
# $ v1: int 1 0 0 0 1 0 1 1 1 0 ... 
# $ v2: int 1 1 1 0 1 1 0 1 1 1 ... 
# $ v3: chr "c" "a" "b" "a" ... 
# $ v4: int 1 0 1 1 0 1 0 1 1 1 ... 

1.했으며 이후 당신이 logical 작업 할 수 있어야한다고 생각합니다 (I은 모든 열이 있다는 가정하에 v3을 포함 0/1 부울)

이것은 첫 번째 시도이다. 불행하게도

sapply(Filter(is.numeric, egg1), 
     function(egg) table(egg == 1)) 
#  v1 v2 v4 
# FALSE 9 7 10 
# TRUE 11 13 10 

, 그것은 하나의 약간의 결함이있다 :이 모든 결과는 항상 사실이 아니다 같은 길이의입니다 가정

set.seed(105966) 
egg1 <- data.frame(
    v1 = sample(0:1, size=20, replace=TRUE), 
    v2 = sample(0:1, size=20, replace=TRUE), 
    v3 = sample(c('a','b','c'), size=20, replace=TRUE), 
    v4 = sample(0:1, size=20, replace=TRUE), 
    stringsAsFactors = FALSE) 
sapply(Filter(is.numeric, egg1), 
     function(egg) table(egg == 1)) 
# $v1 
# FALSE TRUE 
#  9 11 
# $v2 
# FALSE TRUE 
#  8 12 
# $v4 
# TRUE 
# 20 

는 (모든 요소의 길이가 2의이다 반환 때문 목록을 반환하는 것 즉 :. v4가 모두 1이 있었다) 수정 프로그램은 항상 각 단계 중 적어도 하나를 계산하고 에 있는지 확인 보장하는 것입니다 결과에없는 수 :

sapply(Filter(is.numeric, egg1), 
     function(egg) table(c(TRUE, FALSE, egg == 1)) - 1) 
#  v1 v2 v4 
# FALSE 9 8 0 
# TRUE 11 12 20 
0

이 스크린 샷 샘플을 사용하여, 당신의 데이터 프레임을 재편 고려한다. 먼저 melt() 증상 범위 열에서 넓은 범위까지, 그런 다음 dcast()을 사용하여 no/yes를 별도의 열로 마이그레이션하십시오. (

library(reshape2) 

df <- read.csv("Input.csv", stringsAsFactors = FALSE) 

# MELT (LEAVING OUT TIME COLS) 
mdf <- melt(df[!grepl("time", names(df))], id.vars = c("id", "DOB", "weight"), 
      variable.name = "symp_type") 
mdf$key <- 1  
# CAST (FOR NO/YES COLUMNS, SUMMED ON KEY) 
mdf <- dcast(mdf, id + DOB + weight + symp_type ~ value, sum, value.var = "key") 

# UPDATE COLUMNS 
names(mdf)[5:6] <- c("no", "yes") 

mdf$symp_type <- as.character(mdf$symp_type) 
mdf$dose <- sapply(strsplit(as.character(mdf$symp_type),"_"), "[", 1) 
mdf$symp <- sapply(strsplit(as.character(mdf$symp_type),"_"), "[", 2) 
mdf$symp_type <- NULL 

# GROUP AGGREGATION (DATA REPEATS DUE TO REPLICATED DATA IN SAMPLE) 
aggdf <- aggregate(.~symp, mdf[c("symp", "no", "yes")], FUN = sum) 
aggdf 
# symp no yes 
# 1 symp1 18 12 
# 2 symp2 18 12 
# 3 symp3 18 12 

aggdf <- aggregate(.~dose, mdf[c("dose", "no", "yes")], FUN = sum) 
aggdf 
# dose no yes 
# 1 dose1 18 12 
# 2 dose2 18 12 
# 3 dose3 18 12 

aggdf <- aggregate(.~symp + dose, mdf[c("symp", "dose", "no", "yes")], FUN = sum) 
aggdf 
# symp dose no yes 
# 1 symp1 dose1 6 4 
# 2 symp2 dose1 6 4 
# 3 symp3 dose1 6 4 
# 4 symp1 dose2 6 4 
# 5 symp2 dose2 6 4 
# 6 symp3 dose2 6 4 
# 7 symp1 dose3 6 4 
# 8 symp2 dose3 6 4 
# 9 symp3 dose3 6 4 
+0

여러분의 도움에 감사드립니다. 코드를 사용해 보겠습니다. 나는 R에 익숙하지 않지만 그것을 구현하려고 노력할 것이다. – Usman

관련 문제