Add extra names with pervious data - r

I'm trying to add those data with each other, but I found "N/A" in the final output when I enter new names didn't exists in the first vector, so how can i handle it to show all the data without any "N/A"

I think you just want to merge/append two factors, an easy approach would be to convert them to character, append them and make it a factor again.
Just a simple example with letters
p <- as.factor(LETTERS[3:8])
q <- as.factor(LETTERS[1:5])
as.factor(c(as.character(p), as.character(q)))
# [1] C D E F G H A B C D E
# Levels: A B C D E F G H

Related

R convert data table to vector in reverse order

what is the fastest way to convert the data.table:
1: A B C
2: D E F
3: G H I
into the vector: G H I D E F A B C
I use:
X <- X[order(nrow(X):1),]
X <- melt(t(X))$value
But my feeling is, that this can be optimized :-)
Thank you
One option is to reverse the index, transpose to a matrix and concatenate
c(t(X[.N:1]))

Change name of few columns of dataframe using another dataframe. To keep it dynamic, need to match using the name of columns, instead of position

I looked up a lot of similar questions on Stackoverflow but I could not locate the one I am asking.
Consider a dataset:
A B C D E F G
a b c d e f g
And mapping dataset to be:
current desired
B H
C I
D J
E K
F L
namechangevector <- c('B', 'C', 'D', 'E', 'F')
I am using this command:
colnames(data[namechangevector]) <- as.character(mappingdata$desired[match(names(data[namechangevectors]), mappingdata$current)])
But, this doesn't work. However, this works:
colnames(data)[2:6] <- as.character(mappingdata$desired[match(names(data[namechangevectors]), mappingdata$current)])
But since, the vector can have more values and dataset can keep changing. I want to match using the vector and not the position. Please help!

convert only some factors into a different factor

I'm trying to build a factor column that relates to two other factor columns with completely different factor levels. Here's example data.
set.seed(1234)
a<-sample(LETTERS[1:10],50,replace=TRUE)
b<-sample(letters[11:20],50,replace=TRUE)
df<-data.frame(a,b)
df$a<-as.factor(df$a)
df$b<-as.factor(df$b)
The rule I want to make creates a new column, c, that bases it's factor level value based on the value of column a.
if any row in column a ="F", that row in column c will equal whatever the entry is for column b. The code I'm trying:
dfn<-dim(df)[1]
for (i in 1:dfn){
df$c[i]<-ifelse(df$a[i]=="F",df$b[i],df$a[i])
}
df
only spits out the numbered index of the factor level for column b and not the actual entry. What have I done wrong?
I think you'll need to do a little finagling of character values. This seems to do it.
w <- df$a == "F"
df$c <- factor(replace(as.character(df$a), w, as.character(df$b)[w]))
Here is a quick look at the new column,
factor(replace(as.character(df$a), w, as.character(df$b)[w]))
# [1] B G G G I G A C G s G k C J C I C C B C D D B A C I n J I A
# [31] E C D p B H C C J I l G D G D p G E C H
# Levels: A B C D E G H I J k l n p s
As my previous comment, a solution with dplyr:
df %>% mutate(c = ifelse(a == "F", as.character(b), as.character(a)))
If you plan on doing anything involving combinations of the columns as factors, for example, comparisons, you should refactor to the same set of levels.
u<-union(levels(df$a),levels(df$b))
df$a<-factor(df$a,u)
df$b<-factor(df$b,u)
df$c<-df$a
ind<-df$a=="F"
df$c[ind]<-df$b[ind]
By taking this precaution, you can sensibly do
> sum(df$c==df$b)
[1] 6
> sum(df$a=="F")
[1] 6
otherwise the first line will fail.

Loop with column binding

I am self-taught useR so please bear with me.
I have something similar the following dataset:
individual value
a 0.917741317
a 0.689673689
a 0.846208486
b 0.439198006
b 0.366260159
b 0.689985484
c 0.703381117
c 0.29467743
c 0.252435687
d 0.298108973
d 0.42951805
d 0.011187204
e 0.078516181
e 0.498118235
e 0.003877632
I would like to create a matrix with the values for a in column1, values for b in column2, etc. [I also add a 1 at the bottom of every column for a later algebra operations]
I have tried so far:
for (i in unique(df$individual)) {
values <- subset(df$value, df$individual == i)
m <- cbind(c(values[1:3],1))
}
I get a (4,1) matrix with the last individual values. What is missing to make it additive for each loop and get all as many columns as individuals?
This operation is called "reshaping". There is a base function, but I find it easier with the reshape2 package:
DF <- read.table(text="individual value
a 0.917741317
a 0.689673689
a 0.846208486
b 0.439198006
b 0.366260159
b 0.689985484
c 0.703381117
c 0.29467743
c 0.252435687
d 0.298108973
d 0.42951805
d 0.011187204
e 0.078516181
e 0.498118235
e 0.003877632", header=TRUE)
DF$id <- 1:3
library(reshape2)
DF2 <- dcast(DF, id ~ individual)
DF2[,-1]
# a b c d e
#1 0.9177413 0.4391980 0.7033811 0.2981090 0.078516181
#2 0.6896737 0.3662602 0.2946774 0.4295180 0.498118235
#3 0.8462085 0.6899855 0.2524357 0.0111872 0.003877632

R concatenate row labels with colnames

a<-as.factor(c('a','a','b','b','c','d'))
b<-as.factor(c('a','b','c','c','d','a'))
c<-as.factor(c('a','b','d','d','c','b'))
x<-data.frame(a,b,c)
a b c
1 a a a
2 a b b
3 b c d
4 b c d
5 c d c
6 d a b
I have a very large data table (using datatable package) and I would like to simply
take the column names and append them to the row factor values for easy identification.
So in the above simple example (using a data frame for illustration) I would have something
like
a b c
a:a b:a c:a
a:a b:b c:b
a:b b:c c:d
..
..
a:d b:a c:b
I had tried (unsuccessfully) to do some type of apply and paste combination.
But I can't quite pass the colname arguments to paste to each column correctly.
Any ideas on how I could accomplish this task for large data tables? A datatable
approach would be great, but dataframe is fine as well, since it's only a one time
action.
Data frame solution:
x[] <- mapply(function(n, f) {
levels(f) <- paste(n, levels(f), sep=":")
f
}, names(x), x)

Resources