cdf - 1 year ago 72

R Question

i have a question regarding my second function which is not producing what i wanted to

`#example for mt-cars`

selected_cyl_6 <- subset(mtcars, mtcars$cyl==6)

selected_cyl_4 <- subset(mtcars, mtcars$cyl==4)

count <- function(variable,group) {

sum(group[[deparse(substitute(variable))]]== 4)

}

#now i would like to create a matrix with the results like here below:

#example

u<-count(gear,selected_cyl_6)

v<-count(carb,selected_cyl_6)

w<-count(gear,selected_cyl_4)

x<-count(carb,selected_cyl_4)

matrix(c(u,v,w,x), byrow=TRUE, ncol=2, nrow=2)

this is a feasible option, however i would love to convert the lines above into a function because in my dataset there are a lot more variables and i would save a lot of time and code length. i tried it with the following code:

`variables_of_interest <- c("gear","carb")`

groups_of_interest <- c("selected_cyl_6","selected_cyl_4")

alteration_multiple <- function(variable_vector, group_vector){

m.results <- matrix(0, nrow = length(variable_vector), ncol = length(group_vector))

rownames(m.results) <- variable_vector

colnames(m.results) <- group_vector

for (t in 1:length(group_vector)) {

for (i in 1:length(variable_vector)) {

m.results[i,t] <- count(group_vector[t],variable_vector[i])

}

print(m.results)

}

}

alteration_multiple(variable_vector=variables_of_interest, group_vector=groups_of_interest)

any suggestions? thank you so much for your support!

Recommended for you: Get network issues from **WhatsUp Gold**. **Not end users.**

Answer Source

If you're going to use quoted strings to refer to data and variables, we need to modify your two functions.

The main task is to redefine the `count`

function so that it can handle your proposed inputs. We can use `eval`

and `as.name`

to do this.

```
count2 <- function(variable,group) {
sum(eval(as.name(group))[[variable]]== 4)
}
```

```
alteration_multiple2 <- function(variable_vector, group_vector){
m.results <- matrix(0, nrow = length(variable_vector), ncol = length(group_vector))
rownames(m.results) <- variable_vector
colnames(m.results) <- group_vector
for (t in 1:length(group_vector)) {
for (i in 1:length(variable_vector)) {
m.results[i,t] <- count2(variable_vector[i], group_vector[t])
}
}
return(m.results)
}
```

```
variables_of_interest <- c("gear","carb")
groups_of_interest <- c("selected_cyl_6","selected_cyl_4")
alteration_multiple2(variable_vector=variables_of_interest, group_vector=groups_of_interest)
selected_cyl_6 selected_cyl_4
gear 4 8
carb 4 0
```

We can avoid a `for`

loop and execute our function using `matrix`

, `apply`

, and `expand.grid`

.

```
alteration_multiple3 <- function(variables, groups){
matrix(
apply(
expand.grid(variables, groups), 1,
function(x) count2(x[1],x[2])),
nrow = length(variables),
ncol = length(groups),
dimnames = list(variables, groups))
}
```

Recommended from our users: **Dynamic Network Monitoring from WhatsUp Gold from IPSwitch**. ** Free Download**