+1 (315) 557-6473 

Implementing Mensuration Formula in C


Circumference and other mensuration formula implemented in C

Problems 1:
Write a C assignment function, calCircle, to perform the following task:

    Calculate the area of a circle (AC = πr2), the circumference of a circle (CC = 2πr), the volume of a sphere (V S = 4 πr3), or the area of a sphere (AS = 4πr2).
    The first argument is either “AC”, “CC”, “VS”, or “AS” to determine which calculation needs to be performed
    The value that the first argument takes can contain either lower, upper, or mixed cases of letters (Use the toupper function).
    If the values of the argument are not “AC”, “CC”, “VS”, or “AS”, stop the function and write
`your method is not supported.
    The second argument is the radius (r), which is a numeric vector of length great or equal to 1.
    Make sure to use the if  ...  else statement for this problem.
    The function returns a numeric vector.
    Here’re the expected results by calling this function:

>    calCircle('ac',4)

[1]  50.265

>    calCircle('Vs',1:5)

[1]    4.189    33.510  113.097  268.083  523.599


rm(list = ls())


## Defining the function. We shall use the if condition to check for the ## method and will use stop criteria if none of them are met. calCircle <- function( method, r ) { if(toupper(method) == "AC") return(pi*r^2) if(toupper(method) == "CC") return(2*pi*r) if(toupper(method) == "VS") return(4*pi*r^3/3) if(toupper(method) == "AS") return(4*pi*r^2) stop("your method is not supported") } calCircle('ac',4) calCircle('Vs',1:5)

Problems 2:
Write a function, calCircle2, to perform the following task:
    Calculate the area of a circle, the circumference of a circle, the volume of a sphere, and/or the area of a sphere.
    The first argument is a character vector that contains values of “AC”, “CC”, “VS”,  and/or “AS”. The value can contain either lower, upper, or mixed cases of letters. The calculations need to be performed based on the first argument.
    The second argument is a numeric vector of length great or equal to 1.
    The function returns a list that contains the calculated results. The length of the list is the same as the length of the first argument.
    Here’re the expected results by calling this function:

>    calCircle2(c('cc'), 1:4)

$CC
[1]    6.283  12.566  18.850  25.133

>    calCircle2(c('AC',  'VS'),  seq(5,25,5))

$AC
[1]    78.540    314.159    706.858  1256.637  1963.495

$VS
[1]    523.599    4188.790  14137.167  33510.322  65449.847

>    calCircle2(c('AC',  'VS',  "cc",  "aS"),  3:10)

$AC
[1]    28.274    50.265    78.540  113.097  153.938  201.062  254.469  314.159

$VS
[1]   
113.097    268.083    523.599   
904.779  1436.755  2144.661  3053.628  4188.790
$CC [1]   
18.850  25.133  31.416  37.699   
43.982  50.265  56.549  62.832
$AS [1]   
113.097    201.062    314.159   
452.389    615.752    804.248  1017.876  1256.637


## Here we will use Sapply as we need to preserve the name of the list ## We could have used the lapply but the names in the list can't be preserved. calCircle2 <- function( task, r ) { task = as.character(task) return(sapply(task, calCircle, r = r, simplify = F, USE.NAMES = T )) } calCircle2(c('cc'), 1:4) calCircle2(c('AC', 'VS'), seq(5,25,5)) calCircle2(c('AC', 'VS', "cc", "aS"), 3:10)

Problems 3:
You will work with the data frame, chol, for this problem:

>    load("chol.RData")
>    head(chol)                            


 sex
age
choltg ht
wt
sbp
dbp
vldl
hdl
ldl
bmi
id.2
M
60137
50
68.25
111.75
110
70
10
53
 74
2.399066
id.3
M
26
154
202
82.75
184.75
88
64
34
31
92
2.698040
id.4
M
33
198
108
64.25
147.00
120
80
22
34
 132
3.560993
id.5
F
27
154
47
63.25
129.00
110
76
57
57
88
3.224547
id.6
M
36
212
79
67.50
176.25
130
100
16
37
159
3.868313
id.7
F
31
197
90
64.50
121.00
122
78
18
58
 111
 2.908479

Write a function, table1, to perform the following task:
    Calculate the descriptive statistics for each numeric variable, including mean, median, standard deviation, the number of non-missing values, and the number of missing values.
    The first argument is a data frame.
    The second argument is a character vector that contains the names of the variables.
    The returned value is a matrix that contains numeric values.
    For the values of mean, median, or standard deviation, you can round them to two decimal places in the result.
    The expected results look like following

>    table1(chol, c("age"))


Mean
Median
 SD
 N
N_miss
 age
 22.66
17
15.46
192
0


>    table1(chol, c("age", "chol"))


Mean
Median
SD
N
N_miss
age
22.66
17
15.46
192
0
chol
198.57
179
66.64
190
2


>    table1(chol,  c("age",  "chol",  "tg",  "ht",  "wt",  "bmi"))


 Mean
Median
 SD
N
N_miss
age
22.66
17.0015.46
192
0
chol
198.57
179.00
66.64
190
2
tg
80.37
68.00
44.63
190
2
ht
61.43
64.00
9.29
192
0
wt
123.55
126.00
49.40
192
0
bmi
3.10
3.07
0.72
192
0


load("chol.RData") head(chol) ## First we would create a fun function to get all the metrics. funn <- function(x) { return(c( "Mean" = mean(x),"Median" = median(x),"SD" = sd(x), "N" =length(x), "N_miss" = sum(is.na(x)) )) } ## Now we will get the final function just by applying the funn function on each columns table1 <- function( df, cols ) { df_work = df[cols] return(t(sapply(df_work, funn, simplify = "array"))) } table1(chol, c("age")) table1(chol, c("age", "chol")) table1(chol, c("age", "chol", "tg", "ht", "wt", "bmi"))

Problems 4:
You will use the data frame, chol, for this problem.
To test the correlation between two continuous variables, you can use the cor.test function.  For example:

>    age_chol <- cor.test(chol$age, chol$chol)
>    str(age_chol)
 
List of 9
$  statistic    :  Named  num  3.13
..-  attr(*,  "names")=  chr  "t"
$  parameter    :  Named  int  188
..-  attr(*,  "names")=  chr  "df"
$  p.value    :  num  0.00202
$  estimate    :  Named  num  0.223
..-  attr(*,  "names")=  chr  "cor"
$  null.value  :  Named  num  0
..-  attr(*,  "names")=  chr  "correlation"
$  alternative:  chr  "two.sided"
$  method    :  chr  "Pearson's  product-moment  correlation"
$  data.name    :  chr  "chol$age  and  chol$chol"
$  conf.int    :  num  [1:2]  0.0829  0.3538
..-  attr(*,  "conf.level")=  num  0.95
-  attr(*,  "class")=  chr  "htest"

To extract the correlation coefficient and the corresponding p-value, you can write the following:

>    age_chol$estimate

cor 0.2226466

>    age_chol$p.value

[1]  0.002018013

Write a  function named myCorTest,  which is used to calculate the pairwise correlation between one variable with a list of given variables. This function takes three arguments:

dat:  the name of the data frame, such chol.
mainVar:  a  character vector of length  1  that contains the name of a continuous variable.  For example "wt".  You will calculate the correlation between this variable with each of the variables in the third argument.
varlist:  a character vector contains one or more values.  This argument contains the names of a continuous variable.

The function will return a data frame that contains the correlation coefficient and the corresponding p-value between each pair.  For  example,  here  are  some  sample  results  that  are  based  on  the  myCortest function:

>    myCortest  (chol,  "wt",  "age")


var1
var2
R
P
age
wt
age
0.6660014
5.631448e-26


age_chol <- cor.test(chol$age, chol$chol) str(age_chol) ## We shall use loop here for each vars in varlist myCortest <- function( df, mainVar, varlist ) { var1 = rep(mainVar, length(varlist)) R = c() p = c() for(var in varlist) { object = cor.test(unlist(df[mainVar]), unlist(df[var])) R = c(R, object$estimate) p = c(p, object$p.value) } final_dat <- data.frame(var1, "var2" = varlist, "R" = R, "p" = p) rownames(final_dat) <- varlist return(final_dat) } myCortest (chol, "wt", "age") myCortest (chol, "wt", c("age", "chol", "tg", "ht")) myCortest (chol, "bmi", c("sbp", "dbp", "vldl", "hdl", "ldl"))