How can I regroup this two tables together - r

I want to regroup this two variables R (votefr, voteaut) together how can I do it? To have in fine only one variable with the french vote and the austrian vote (maybe votefraut).
(below the table of this two variables)
table(d$votefr)
Centre-droite Extreme-droite Gauche
455 117 356
table(d$voteaut)
Centre-Droite Extreme-Droite Gauche
424 208 545
The result that I want is:
table(d$votefraut)
Centre-Droite Extreme-Droite Gauche
879 325 901

If you want to sum up all votes across different countries, you can try
Reduce(`+`, Map(table, df))
Otherwise, you can check table(df)

If both columns are factors with the same levels, we can just add them:
table(d$votefr) + table(d$voteaut)
If they are character class or factor with different levels, we need convert them to factors with the same levels.

Related

Order a vector in function to another vector

>nuevos<-(exam[411:510,1])
> [,1]
401 -0.325087210
402 0.576824342
403 0.314110438
404 -0.710141482
405 0.079179458
406 0.876819478
407 -0.563755647
408 -0.024573542
409 0.072860869
410 0.141759722
411 0.645346837
412 -0.178754696
413 -0.745086021
414 0.741761201
415 1.537360962
416 0.478560270
417 -0.721503050
418 -0.136435690
419 -0.264058207
420 1.851815905
421 0.854542022
422 0.055184071
423 0.214454147
424 -0.374941314
425 0.268580192
426 0.458531169
427 0.440158449
428 -1.539627467
429 -0.146698388
430 -0.174844929
This is my data, it's a matrix. The first column is the ID and the second column is the X value. I want to select 10 ID. In the 10 selected, 5 should be from unpair number ID, and the other 5 should be from ood number ID. The 10 ID selection should be in function from the X value (the most negative value is the best). I want to have something like this:
ID X
428 -1.539627467
413 -0.745086021
....
I tried to use sort(data[data%%2==1])[1:5] but I don't understand how can I extract the column ID from the dataset, because this is a result from a linear model, so R give me the positions but I want to work with this positions and the X value. Please, help me!
Thanks.
The numbers in the first "column" are the rownames of the matrix.
Since the objects in your question have differing names, it's not entirely clear to me if the following works like that.
So I would do something like this:
df=data.frame(ID=rownames(exam),X=exam[,1])
Otherwise please post the output of dput(exam) or dput(data)
Based on what I think you want to do, here's a working example, given the following data frame:
# generate random input data
data <- data.frame(ID=1:20, X=rnorm(20))
Tidyverse offers the cleanest solution:
require(tidyverse)
data %>%
arrange(X)
will sort in ascending order according to column x. Check the documentation for arrange for further details; you can do more complex things such as sorting by group, sorting on multiple columns (ie, specify a first column, and break ties based on successively sorted columns, etc). So what I would recommend would be to put your data into a data frame first:
data <- data.frame(ID=rownames(nuevos), X=nuevos[,1])
where you could substitute ID with whatever you want and then do the above. Add a dput of nuevos for more specific feedback. Note there are a million ways under the sun to do this not involving tidyverse (ie, sort as you mentioned, for instance); tidyverse just tends to make for the cleanest, simplest mechanism in my opinion (since it is plug and play with many other useful things, like ggplot, dplyr, etc) and is really a great way of thinking to get accustomed to for working with data frames, such as this.

Rolling subset of data frame within for loop in R

Big picture explanation is I am trying to do a sliding window analysis on environmental data in R. I have PAR (photosynthetically active radiation) data for a select number of sequential dates (pre-determined based off other biological factors) for two years (2014 and 2015) with one value of PAR per day. See below the few first lines of the data frame (data frame name is "rollingpar").
par14 par15
1356.3242 1306.7725
NaN 1232.5637
1349.3519 505.4832
NaN 1350.4282
1344.9306 1344.6508
NaN 1277.9051
989.5620 NaN
I would like to create a loop (or any other way possible) to subset the data frame (both columns!) into two week windows (14 rows) from start to finish sliding from one window to the next by a week (7 rows). So the first window would include rows 1 to 14 and the second window would include rows 8 to 21 and so forth. After subsetting, the data needs to be flipped in structure (currently using the melt function in the reshape2 package) so that the values of the PAR data are in one column and the variable of par14 or par15 is in the other column. Then I need to get rid of the NaN data and finally perform a wilcox rank sum test on each window comparing PAR by the variable year (par14 or par15). Below is the code I wrote to prove the concept of what I wanted and for the first subsetted window it gives me exactly what I want.
library(reshape2)
par.sub=rollingpar[1:14, ]
par.sub=melt(par.sub)
par.sub=na.omit(par.sub)
par.sub$variable=as.factor(par.sub$variable)
wilcox.test(value~variable, par.sub)
#when melt flips a data frame the columns become value and variable...
#for this case value holds the PAR data and variable holds the year
#information
When I tried to write a for loop to iterate the process through the whole data frame (total rows = 139) I got errors every which way I ran it. Additionally, this loop doesn't even take into account the sliding by one week aspect. I figured if I could just figure out how to get windows and run analysis via a loop first then I could try to parse through the sliding part. Basically I realize that what I explained I wanted and what I wrote this for loop to do are slightly different. The code below is sliding row by row or on a one day basis. I would greatly appreciate if the solution encompassed the sliding by a week aspect. I am fairly new to R and do not have extensive experience with for loops so I feel like there is probably an easy fix to make this work.
wilcoxvalues=data.frame(p.values=numeric(0))
Upar=rollingpar$par14
for (i in 1:length(Upar)){
par.sub=rollingpar[[i]:[i]+13, ]
par.sub=melt(par.sub)
par.sub=na.omit(par.sub)
par.sub$variable=as.factor(par.sub$variable)
save.sub=wilcox.test(value~variable, par.sub)
for (j in 1:length(save.sub)){
wilcoxvalues$p.value[j]=save.sub$p.value
}
}
If anyone has a much better way to do this through a different package or function that I am unaware of I would love to be enlightened. I did try roll apply but ran into problems with finding a way to apply it to an entire data frame and not just one column. I have searched for assistance from the many other questions regarding subsetting, for loops, and rolling analysis, but can't quite seem to find exactly what I need. Any help would be appreciated to a frustrated grad student :) and if I did not provide enough information please let me know.
Consider an lapply using a sequence of every 7 values through 365 days of year (last day not included to avoid single day in last grouping), all to return a dataframe list of Wilcox test p-values with Week indicator. Then later row bind each list item into final, single dataframe:
library(reshape2)
slidingWindow <- seq(1,364,by=7)
slidingWindow
# [1] 1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 113 120 127
# [20] 134 141 148 155 162 169 176 183 190 197 204 211 218 225 232 239 246 253 260
# [39] 267 274 281 288 295 302 309 316 323 330 337 344 351 358
# LIST OF WILCOX P VALUES DFs FOR EACH SLIDING WINDOW (TWO-WEEK PERIODS)
wilcoxvalues <- lapply(slidingWindow, function(i) {
par.sub=rollingpar[i:(i+13), ]
par.sub=melt(par.sub)
par.sub=na.omit(par.sub)
par.sub$variable=as.factor(par.sub$variable)
data.frame(week=paste0("Week: ", i%/%7+1, "-", i%/%7+2),
p.values=wilcox.test(value~variable, par.sub)$p.value)
})
# SINGLE DF OF ALL P-VALUES
wilcoxdf <- do.call(rbind, wilcoxvalues)

Calculating overlapping between different datasets using R

I have 49 datasets which include different values like this.
inPUT=read.table(file="TEST.csv", sep=",", header=T, row.names=1)
class(inPUT)
[1] "data.frame"
length(inPUT)
[1] 49
head(inPUT)
GO.1 GO.2 ... GO.49
1 811 811 ... 811
2 813 814 ... 814
3 814 819 ... 817
length(inPUT$GO.1)
[1]191
length(inPUT$GO.49)
[1]170
I'd like to calculate overlap between two different datasets among total 49 datasets (all possible pairwise calculation). Is there any R package to calculate how two sets overlap (I'm still new but..). Any ideas?
Is it so that every dataset only represents one column, as in your example?
One possible option is to use the '%in%' operator function, e.g.
mean(GO.1 %in% GO.2)
will tell you the percentage of observation in GO.1 are also present in GO.2. If you want to calculate the total overlap, you could use it in a function.
You can use outer to compute pairwise combinations, and intersect to find the members that are in both sets. So something like:
outer(inPUT, inPUT, intersect)
may help.

How does R know that I have no entries of a certain type

I have a table where one of the variables is country of registration.
table(df$reg_country)
returns:
AR BR ES FR IT
123 202 578 642 263
Now, if I subset the original table to exclude one of the countries
df_subset<-subset(df, reg_country!='AR')
table(df_subset$reg_country)
returns:
AR BR ES FR IT
0 202 578 642 263
This second result is very surprising to me, as R seems to somehow magically know that I have removed the the entries from AR.
Why does that happen?
Does it affect the size of the second data frame (df_subset)? If 'yes' - is there a more efficient way to to subset in order to minimize the size?
df$reg_country is a factor variable, which contains the information of all possible levels in the levels attribute. Check levels(df_subset$reg_country).
Factor levels only have a significant impact on data size if you have a huge number of them. I wouldn't expect that to be the case. However, you could use droplevels(df_subset$reg_country) to remove unused levels.

Choose higher values from two columns after extracting the number, R

I have a data frame (451 obs of 8 variables) that has two columns (6&7) that look like this:
Major Minor
C:726 T:2
A:687 G:41
T:3 C:725
I want to create one column that summarises this. To do this, I don't care about the letters in each cell, but I want the larger number to remain, whatever row it's in. i.e. I want it to look like this:
Summary_column
726
687
725
Not necessary, but for those that wonder what Im doing, this is the output from a programme called VCFtools; it has a count function that counts alleles in a VCF, but sometimes it names the allele as "Minor" when it is clearly more common.
Thanks for your help!
I would do something like this :
extract <- function(v) {
gsub("^.*:", "", v)
}
within(d, Summary_column <- pmax(extract(Major), extract(Minor)))
Which gives :
Major Minor Summary_column
1 C:726 T:2 726
2 A:687 G:41 687
3 T:3 C:725 725

Resources