2017-11-06 3 views
-1

저는 정기적으로이 형식으로 출력을 가져오고 하나씩 Excel에서 복사/붙여 넣기를해야하므로 스크립팅을 활용하는 방식으로 코딩하려고합니다. 하기 싫은 일. 그러나, 기능을 구현할 때 막혔어요.함수를 구현하는 데 도움이 필요합니다.

그래서, 내 데이터 형식은 다음과 같습니다

나는 다음과 같은 식에 적용 할 필요가
Condition Sample1 Sample2 .... Sample n 
T1  6.99 5.80 .... n_1  
T2  2.05 3.04 .... n_1  
T3  4.50 4.69 .... n_1  
T4  4.71 5.22 .... n_1  
T5  5.66 3.65 .... n_1  
T6  9.76 2.89 .... n_1  

: Equation, x는 전체 방정식 뭔가를 보이는 것으로, 이러한 개별 항목입니다 n은 계수 이렇게 :

Example.

기본적으로, 각 요소를 순서대로 고려한 다음 각 샘플에 대해 S의 순차 계수 (1 : 길이 조건의 홀수)를 곱해서 계산해야합니다. 내 데이터 세트의 크기는 변경되지 않습니다. 항상 T1 : T6이 될 것이고, 변경되는 것은 샘플 1 ... n입니다. 이상적으로 S의 값이 열의 맨 아래에 추가되거나 해당 데이터가 속한 샘플을 참조하여 별도의 데이터 세트에 저장되는 것이 이상적입니다.

나는 전치를 포함하여 여러 가지 해결책을 시도했지만 내 머리를 감쌀 수는 없습니다.

데이터 집합의 일부에서 더 간단한 함수를 구현하려는 현재의 시도는 성공하지 못했습니다.

for (i in 2:8){dT[7,i] <- 
    ((1*dT[1,i])+(3*dT[2,i])+(5*dT[3,i])+(7*dT[4,i])+(9*dT[5,i]))+(11*dT[6,i]) 
} 

올바른 솔루션에는 * 적용되는 것이 포함되지만 적절하게 사용하는 방법에 대해서는 전혀 알지 못합니다.

편집 :

N Condition Sample A Sample B Sample C Sample D 

1 T1   91.323  78.758  70.298  66.765 
3 T2   -3.737  -1.5  -7.744  -9.247 
5 T3   5.205  4.533  2.284  2.178 
7 T4   -0.486  -0.068  -1.386  -0.927 
9 T5   0.337  -0.139  0.087  0.055 
    S  -0.046296296 -0.123654391 0.394039047 0.445258425 
+1

그것은 당신이 적절한 [재현 예]를 제공하는 경우 당신을 도와 쉽게 (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) R에 복사하여 붙여 넣을 수있는 샘플 입력과 해당 입력에 대한 원하는 출력이 있으므로 가능한 솔루션을 테스트하고 검증 할 수 있습니다. – MrFlick

+0

은 Excel에서 이전 반복에서 재현 예컨대 일부 데이터 (: T5하지 T6, 그러나 동일한 원리가 적용 T1 사용) 승산기 \t 조건을 \t 시료 A \t 샘플 B \t 샘플 C \t 샘플 D 1 \t T1 \t을 91.323 78.758 \t \t \t 70.298 66.765 3 T2 \t \t \t -3.737 -7.744 -1.5 \t \t \t -9.247 5 T3 \t \t 5.205 4.533 2.284 \t,972 687,090,223,210 2.178 7 T4 \t \t \t -0.486 -0.068 -1.386 \t \t -0.927 9 T5 \t \t \t 0.337 -0.139 0.087 \t \t \t 0.055 S \t -0.046296296 -0.123654391 \t \t \t 0.394039047 0.445258425 – zirconium

답변

0

이합니까, 당신이하고 싶은 : 재생 가능한 예제를 추가?

per_row <- function(row){ 
    l <- length(row) 
    exp <- 2*(1:l)-1 # all the exponents 
    each <- row*(-1)^exp # compute all of these at once 
    return(sum(each)) # return sum 
} 

#some sample data 
datafr <- data.frame(a = sample(1:6), b = 1:6) 

#apply per column 
apply(datafr, 2, per_row) 
+0

> 행 오류 * (-1)^exp : 2 진수 연산자에 대한 숫자가 아닌 인수. 열 1의 경우 대답은 -1.62이고 열 2는 0.645입니다. 내가 뭘 잘못하고 있는지 잘 모르겠다. [edit2 :이 대답은 n_odd = 1-> 11에 대한 sum [n (x)] 형태의 간단한 연산이다. x는 엔트리이다. – zirconium

+0

이 문제는 매우 쉽게 풀릴 것이다. MATLAB에서 그것을 생각해 보게됩니다 - 그것은 열 벡터 연산입니다. 이상적으로는 R에서 그것을 풀 수 있지만, MATLAB은 현재 쉽게 사용할 수 없습니다. – zirconium

+0

첫 번째 : n_odd'exp'의 벡터를 호출하는 것은 나에게 현명하지 않았습니다. 이것은 이미 함수의 이름이기 때문입니다. 둘째 : 위의 코드를 바닐라'R' 세션에 복사 할 때 오류나 오류가 발생하지 않습니다. 그러나 당신의'dT'는 첫 번째 열이 숫자가 아닌 것입니다. 그래서'apply (dT [, 2 : 5), 2, per_row]'가 그 일을해야합니다. 아직 결과를 확인하지 않았습니다. – Bernhard

0

그것은 당신이 가지고있는 SampleN 컬럼의 개수에 불가 지합니다. 그것은 단지 6 개의 홀수 배수가있는 6 가지 조건을 위해 특별히 설계되었지만 변경되지 않으므로 문제가 없다고 말했습니다.


suppressPackageStartupMessages(library(dplyr)) 
suppressPackageStartupMessages(library(tidyr)) 

samples <- tribble(
    ~Sample1, ~Sample2, ~Sample3, 
    6.99, 5.80, 2.5, 
    2.05, 3.04, 3.4,  
    4.50, 4.69, 8.7,  
    4.71, 5.22, 8.6,  
    5.66, 3.65, 3.4,  
    9.76, 2.89, 5.6 
) 

samples 
#> # A tibble: 6 x 3 
#> Sample1 Sample2 Sample3 
#>  <dbl> <dbl> <dbl> 
#> 1 6.99 5.80 2.50 
#> 2 2.05 3.04 3.40 
#> 3 4.50 4.69 8.70 
#> 4 4.71 5.22 8.60 
#> 5 5.66 3.65 3.40 
#> 6 9.76 2.89 5.60 

samples_modified <- samples %>% 
    # Add the multipliers as a column 
    mutate(multiplier = c(1,3,5,7,9,11)) %>% 

    # Gather all the samples. Make it 'tidy' 
    gather(key = "sample", value = "x", -multiplier) %>% 

    # Perform the multiplication on each element, we will sum later 
    mutate(x_modified = x * (-1)^((multiplier - 1)/2)) 

# Now we want to sum the x_modified column for each sample group 
samples_modified %>% 
    group_by(sample) %>% 
    summarise(S = sum(x_modified)) 
#> # A tibble: 3 x 2 
#> sample  S 
#> <chr> <dbl> 
#> 1 Sample1 0.630 
#> 2 Sample2 2.99 
#> 3 Sample3 -3.00 
+0

이 기능은 완벽하게 작동합니다 (이미 많은 감사드립니다).하지만 데이터를 수동으로 입력해야만 가능합니다. 그러나 데이터를 강제 변환하는 데 약간의 문제가 있습니다. 데이터를 데이터 테이블로 입력하면 예 : samples <- data.table (openxlsx :: read.xlsx ("samples.xlsx", sheet = 3))) 다음 계속 던지고 : > mutate_impl (.data, dots) 오류 : 평가 오류 : 이진 연산자에 숫자가 아닌 인수. as.numeric throws로 강제 변환하려고 시도했습니다. 오류 : (목록) 객체를 'double'을 입력 할 수 없습니다. 내 열의 일부에 NA 값이 포함되어있을 가능성이 있습니다.이 값이 "깨뜨릴"수 있습니까? – zirconium

+0

위의 드리블에있는 값 중 하나를 'NA'로 바꾸었지만 여전히 실행되었습니다.이 샘플에 대해 'S'에 대해 'NA'값을 부여했습니다. 나는 또한 tibble (수정 된 data.frame)을 data.table로 강요하고 다시 실행했는데 모든 것이 잘 작동하는 것처럼 보인다. 실제로 문제를 진단하려면 전체 데이터 세트를 확인해야합니다. 당신은 확실히 data.table을 숫자로 강요하고 싶지는 않습니다. 그것은 작동하지 않습니다. 일부 열이 숫자가 아닌 문자로 가져올 수 있습니까? 'sum (sapply (NAMEOFDATATABLE, is.character))'는 무엇을 반환합니까? (0이어야 함) –

0

은 간단 보인다. R은 벡터화 된 사용 벡터의 곱셈이기 때문에. 그런 다음 sum.

zirconium <- function(x){ 
    n <- 2*seq_along(x) - 1 
    sum(x * (-1)^((n - 1)/2)) 
} 

sapply(dT[-1], zirconium) 
#Sample1 Sample2 
# 0.63 2.99 

데이터.

dT <- 
structure(list(Condition = structure(1:6, .Label = c("T1", "T2", 
"T3", "T4", "T5", "T6"), class = "factor"), Sample1 = c(6.99, 
2.05, 4.5, 4.71, 5.66, 9.76), Sample2 = c(5.8, 3.04, 4.69, 5.22, 
3.65, 2.89)), .Names = c("Condition", "Sample1", "Sample2"), class = "data.frame", row.names = c(NA, 
-6L)) 
+0

그것을 적용하려고 시도 할 때 여전히 숫자가 아닌 인수를 이진 연산자 오류로 던지고 있습니다./class (myData) [1] "data.table" "data.frame"어떻게 강요 할 수 있습니까? 나는 NAs를 data.table (t (na.omit (t) (myData))를 사용하여 제거하려고 시도했으나 도움이되지 않았다.) – zirconium

+0

@zirconium 나는 그 오류가 발생하면 질문을 편집하고 출력을 게시해야한다고 생각한다. 거기에'dput (dT) '라는 단어가 들어 있습니다. (주석에 포함되지 않습니다.) 이와 같이 우리는 여러분의 데이터의 정확한 복사본을 가지고 그것으로 여러 답을 테스트 할 것입니다. –

관련 문제