I have a very large dataset, so I want to avoid loops.
I have three columns of data:
col1 = time presented as 10000, 10001, 10002, 10100, 10101, 10102,
10200, 10201, 10202, 10300, ... (total 18000 times)
col2 = id number 1 2 3 4 ... (total 500 ids)
col3 = reading associated with particular id at particular time. 0.1
0.5 0.6 0.7... Say this is called Data3
10000 1 0.1
10001 1 0.5
10002 1 0.6
10100 1 0.7
10200 1 0.6 (NOTE - some random entries missing)
I want to present this as a matrix (called DataMatrix), but there is missing data, so a simple reshape will not do. I want to have the missing data as NA entries.
DataMatrix is currently an NA matrix of 500 columns and 18000 rows, where the row names and column names are the times and ids respectively.
1 2 3 4 ....
10000 NA NA NA NA ....
10001 NA NA NA NA ....
Is there a way I can get R to go through each row of Data3, completing DataMatrix with the reading Data3[,3] by placing it in the row and column of the matrix whose names relate to the Data3[,1] and Data3[,2]. But without loops.
Thanks to all you smart people out there.
If I understood you correctly:
Data3 <- data.frame(col1=10000:10499,
col2=1:500,
col3=round(runif(500),1))
library(reshape2)
DataMatrix <- dcast(Data3, col1~col2, value.var="col3")
DataMatrix[1:5, 1:5]
# col1 1 2 3 4
# 1 10000 0.4 NA NA NA
# 2 10001 NA 0.6 NA NA
# 3 10002 NA NA 0.9 NA
# 4 10003 NA NA NA 0.5
# 5 10004 NA NA NA NA
Here is a solution with possible id values in 1:10 and times values in 1:20. First, create data:
mx <- matrix(c(sample(1:20, 5), sample(1:10, 5), sample(1:50, 5)), ncol=3, dimnames=list(NULL, c("time", "id", "reading")))
times <- 1:20
ids <- 1:10
mx
# time id reading
# [1,] 4 3 25
# [2,] 5 4 9
# [3,] 9 7 45
# [4,] 18 1 40
# [5,] 11 8 28
Now, use outer to pass every possible combination of time/id to a look up function that returns the corresponding reading value:
outer(times, ids,
function(x, y) {
mapply(function(x.sub, y.sub) {
val <- mx[mx[, 1] == x.sub & mx[, 2] == y.sub, 3]
if(length(val) == 0L) NA_integer_ else val
},
x, y)
} )
This produces the (hopefully) desired answer:
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] NA NA NA NA NA NA NA NA NA NA
# [2,] NA NA NA NA NA NA NA NA NA NA
# [3,] NA NA NA NA NA NA NA NA NA NA
# [4,] NA NA 25 NA NA NA NA NA NA NA
# [5,] NA NA NA 9 NA NA NA NA NA NA
# [6,] NA NA NA NA NA NA NA NA NA NA
# [7,] NA NA NA NA NA NA NA NA NA NA
# [8,] NA NA NA NA NA NA NA NA NA NA
# [9,] NA NA NA NA NA NA 45 NA NA NA
# [10,] NA NA NA NA NA NA NA NA NA NA
# [11,] NA NA NA NA NA NA NA 28 NA NA
# [12,] NA NA NA NA NA NA NA NA NA NA
# [13,] NA NA NA NA NA NA NA NA NA NA
# [14,] NA NA NA NA NA NA NA NA NA NA
# [15,] NA NA NA NA NA NA NA NA NA NA
# [16,] NA NA NA NA NA NA NA NA NA NA
# [17,] NA NA NA NA NA NA NA NA NA NA
# [18,] 40 NA NA NA NA NA NA NA NA NA
# [19,] NA NA NA NA NA NA NA NA NA NA
# [20,] NA NA NA NA NA NA NA NA NA NA
Related
I've generated a small world network with 16 agents with igraph:
myNetwork <- sample_smallworld(dim = 1, nei = 1, size = 16, p = 0.1) #generate small world
plot(myNetwork, vertex.size=20, vertex.label=c(1:16), layout=layout_in_circle) #inspect the network
In a separate dataframe, stack, I have each of these agents' opinion (opinion1):
> stack
agent opinion1
1 1 0.71979146
2 2 0.25040406
3 3 0.50866647
4 4 0.53713674
5 5 0.53954982
6 6 0.23903034
7 7 0.03989347
8 8 0.29350197
9 9 0.85441826
10 10 0.44565889
11 11 0.28223782
12 12 0.39748249
13 13 0.17488017
14 14 0.08804374
15 15 0.61174168
16 16 0.30949636
I now want to calculate each agent's updated opinion (let's call it opinion2) by applying this equation, where networkNeighborsOpinion1 refers to the opinion1s of the agents that are connected in myNetwork:
opinion2 <- 0.5 * opinion1 * 0.5 * (mean(networkNeighborsOpinion1))
Given myNetwork and DF$opinion1, how can I efficiently apply this equation to each agent?
Here's my thinking so far...
From myNetwork, the corresponding adjacency matrix can be retrieved like so:
adjMatrix <- as.matrix(as_adjacency_matrix(myNetwork, names = TRUE, edges = FALSE))
adjMatrix[adjMatrix == 0] <- NA #turn all 0s into NAs
> adjMatrix
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
[1,] NA 1 NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] 1 NA 1 NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA 1 NA NA NA NA NA NA NA NA NA NA NA 1 NA
[4,] NA NA NA NA 1 NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA 1 NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA 1 NA NA NA NA NA NA 1 NA
[7,] NA NA NA NA NA 1 NA 1 NA NA NA NA NA NA NA
[8,] NA NA NA NA NA NA 1 NA 1 NA NA NA NA NA NA
[9,] NA NA NA NA NA NA NA 1 NA 1 NA NA NA NA NA
[10,] NA NA NA NA NA NA NA NA 1 NA 1 NA NA NA NA
[11,] NA NA NA NA NA NA NA NA NA 1 NA 1 NA NA NA
[12,] NA NA NA NA NA NA NA NA NA NA 1 NA 1 NA NA
[13,] NA NA NA NA NA NA NA NA NA NA NA 1 NA 1 NA
[14,] NA NA 1 NA NA 1 NA NA NA NA NA NA 1 NA 1
[15,] NA NA NA NA NA NA NA NA NA NA NA NA NA 1 NA
[16,] 1 NA NA NA NA NA NA NA NA NA NA NA NA NA 1
Each agent is represented by a row in adjMatrix, and each network connection is indicated by a value of 1.
Then, it seems like there should be way to use each row of adjMatrix to call the appropriate values from stack$opinion1 and generate a vector of networkNeighborsOpinion1, which could then be used to compute an opinion2 for each agent. Note that I've changed the 0s in adjMatrix to NAs, which follows my thinking that each row could by multiplied by the corresponding values in stack$opinion1 (i.e., each opinion1 is either multiplied by 1 or NA, which could then be input as mean(networkNeighborsOpinion1, na.rm = TRUE))
Any direction on this would be appreciated. Perhaps a for loop or function?
Multiply the adjacency matrix by opinion1 and divide by the sum of corresponding rows in the adjacency matrix. Then average that with opinion1.
adjMatrix <- as.matrix(as_adjacency_matrix(myNetwork, names = TRUE, edges = FALSE))
0.5 * stack$opinion1 + 0.5 * (adjMatrix %*% stack$opinion1) / rowSums(adjMatrix)
Note
stack is reproducible form is:
Lines <- " agent opinion1
1 1 0.71979146
2 2 0.25040406
3 3 0.50866647
4 4 0.53713674
5 5 0.53954982
6 6 0.23903034
7 7 0.03989347
8 8 0.29350197
9 9 0.85441826
10 10 0.44565889
11 11 0.28223782
12 12 0.39748249
13 13 0.17488017
14 14 0.08804374
15 15 0.61174168
16 16 0.30949636"
stack <- read.table(text = Lines)
I can not understand why when using the gradlik function as argument to the Optim function I get the following error:
Error in optim(beta, loglik, gradlik, method = "BFGS", hessian = T, control = list(fnscale = -1)):
gradient in optim evaluated to length 9000 not 9
However, by calling the gradlik (beta) function it returns the gradient vector as expected!
Does anyone have any suggestions for correcting this code?
loglik <- function(beta) {
NXS <- dim(model.matrix(~XS))[2]#Numbers of columns of XS+1
NXO <- dim(model.matrix(~XO))[2]#Numbers of columns of XO+1
## parameter indices
ibetaS <- 1:NXS
ibetaO <- seq(tail(ibetaS, 1)+1, length=NXO)
isigma <- tail(ibetaO, 1) + 1
irho <- tail(isigma, 1) + 1
g <- beta[ibetaS]
b <- beta[ibetaO]
sigma <- beta[isigma]
if(sigma < 0) return(NA)
rho <- beta[irho]
if( ( rho < -1) || ( rho > 1)) return(NA)
XS.g <- model.matrix(~XS) %*% g
XO.b <- model.matrix(~XO) %*% b
u2 <- YO - XO.b
r <- sqrt( 1 - rho^2)
B <- (XS.g + rho/sigma*u2)/r
ll <- ifelse(YS == 0,
(pnorm(-XS.g, log.p=TRUE)),
dnorm(u2/sigma, log = TRUE) - log(sigma) +
(pnorm(B, log.p=TRUE))
)
sum(ll)
}
gradlik <- function(beta) {
NXS <- dim(model.matrix(~XS))[2]
NXO <- dim(model.matrix(~XO))[2]
nObs <- length(YS)
NO <- length(YS[YS > 0])
nParam <- NXS + NXO + 2 #Total of parameters
XS0 <- XS[YS==0,,drop=FALSE]
XS1 <- XS[YS==1,,drop=FALSE]
YO[is.na(YO)] <- 0
YO1 <- YO[YS==1]
XO1 <- XO[YS==1,,drop=FALSE]
N0 <- sum(YS==0)
N1 <- sum(YS==1)
w <- rep(1,N0+N1 )
w0 <- rep(1,N0)
w1 <- rep(1,N1)
NXS <- dim(model.matrix(~XS))[2]
NXO <- dim(model.matrix(~XO))[2]
## parameter indices
ibetaS <- 1:NXS
ibetaO <- seq(tail(ibetaS, 1)+1, length=NXO)
isigma <- tail(ibetaO, 1) + 1
irho <- tail(isigma, 1) + 1
g <- beta[ibetaS]
b <- beta[ibetaO]
sigma <- beta[isigma]
if(sigma < 0) return(matrix(NA, nObs, nParam))
rho <- beta[irho]
if( ( rho < -1) || ( rho > 1)) return(matrix(NA, nObs, nParam))
XS0.g <- as.numeric(model.matrix(~XS0) %*% g)
XS1.g <- as.numeric(model.matrix(~XS1) %*% g)
XO1.b <- as.numeric(model.matrix(~XO1) %*% b)
# u2 <- YO1 - XO1.b
u2 <- YO1 - XO1.b
r <- sqrt( 1 - rho^2)
# B <- (XS1.g + rho/sigma*u2)/r
B <- (XS1.g + rho/sigma*u2)/r
lambdaB <- exp( dnorm( B, log = TRUE ) - pnorm( B, log.p = TRUE ) )
gradient <- matrix(0, nObs, nParam)
gradient[YS == 0, ibetaS] <- - w0 * model.matrix(~XS0) *
exp( dnorm( -XS0.g, log = TRUE ) - pnorm( -XS0.g, log.p = TRUE ) )
gradient[YS == 1, ibetaS] <- w1 * model.matrix(~XS1) * lambdaB/r
gradient[YS == 1, ibetaO] <- w1 * model.matrix(~XO1) * (u2/sigma^2 - lambdaB*rho/sigma/r)
gradient[YS == 1, isigma] <- w1 * ( (u2^2/sigma^3 - lambdaB*rho*u2/sigma^2/r) - 1/sigma )
gradient[YS == 1, irho] <- w1 * (lambdaB*(u2/sigma + rho*XS1.g))/r^3
return(colSums(gradient))
}
n=1000
X1 <- runif(n)
X2 <- runif(n)
XO <- cbind(X1,X2)
X3 <- runif(n)
XS <- cbind(X1,X2,X3)
YS <- sample(c(0,1),n,replace = TRUE)
YO <- sample(100:400,n,replace = TRUE)*YS
beta <- c(1,1,1,1,1,1,1,1,0.5)
#Note that the function below compiles normally:
gradlik(beta)
#But the Optim function does not compile:
theta <-optim(beta,loglik, gradlik, method = "BFGS",hessian = T,control=list(fnscale=-1))
theta$par
Your gradient function needs to give as output a vector with the same size as the number of parameters.
While your final return() is indeed a vector, in your current implementation, there are two other return() in the middle of the code where you still return a matrix.
For instance, when sigma <0 your code returns:
if(sigma < 0) return(matrix(NA, nObs, nParam))
Which is a 9000 x 9 matrix, hence making optim() complain as stated in its error message.
Also when ( rho < -1) || ( rho > 1) your function returns:
if( ( rho < -1) || ( rho > 1)) return(matrix(NA, nObs, nParam))
Which, again, is a 9000 x 9 matrix, resulting in the error.
Therefore, you should start fixing those parts of the code, changing them to return a vector with the same size as the number of parameters.
To see an example of your code returning a matrix, run this:
gradlik(rep(-1, 9))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA
[7,] NA NA NA NA NA NA NA NA NA
[8,] NA NA NA NA NA NA NA NA NA
[9,] NA NA NA NA NA NA NA NA NA
[10,] NA NA NA NA NA NA NA NA NA
[11,] NA NA NA NA NA NA NA NA NA
[12,] NA NA NA NA NA NA NA NA NA
[13,] NA NA NA NA NA NA NA NA NA
[14,] NA NA NA NA NA NA NA NA NA
[15,] NA NA NA NA NA NA NA NA NA
[16,] NA NA NA NA NA NA NA NA NA
[17,] NA NA NA NA NA NA NA NA NA
[18,] NA NA NA NA NA NA NA NA NA
[19,] NA NA NA NA NA NA NA NA NA
[20,] NA NA NA NA NA NA NA NA NA
[21,] NA NA NA NA NA NA NA NA NA
[22,] NA NA NA NA NA NA NA NA NA
[23,] NA NA NA NA NA NA NA NA NA
[24,] NA NA NA NA NA NA NA NA NA
[25,] NA NA NA NA NA NA NA NA NA
[26,] NA NA NA NA NA NA NA NA NA
[27,] NA NA NA NA NA NA NA NA NA
[28,] NA NA NA NA NA NA NA NA NA
[29,] NA NA NA NA NA NA NA NA NA
[30,] NA NA NA NA NA NA NA NA NA
[31,] NA NA NA NA NA NA NA NA NA
[32,] NA NA NA NA NA NA NA NA NA
[33,] NA NA NA NA NA NA NA NA NA
[34,] NA NA NA NA NA NA NA NA NA
[35,] NA NA NA NA NA NA NA NA NA
[36,] NA NA NA NA NA NA NA NA NA
[37,] NA NA NA NA NA NA NA NA NA
[38,] NA NA NA NA NA NA NA NA NA
[39,] NA NA NA NA NA NA NA NA NA
[40,] NA NA NA NA NA NA NA NA NA
[41,] NA NA NA NA NA NA NA NA NA
[42,] NA NA NA NA NA NA NA NA NA
[43,] NA NA NA NA NA NA NA NA NA
[44,] NA NA NA NA NA NA NA NA NA
[45,] NA NA NA NA NA NA NA NA NA
[46,] NA NA NA NA NA NA NA NA NA
[47,] NA NA NA NA NA NA NA NA NA
[48,] NA NA NA NA NA NA NA NA NA
[49,] NA NA NA NA NA NA NA NA NA
[50,] NA NA NA NA NA NA NA NA NA
[51,] NA NA NA NA NA NA NA NA NA
[52,] NA NA NA NA NA NA NA NA NA
[53,] NA NA NA NA NA NA NA NA NA
[54,] NA NA NA NA NA NA NA NA NA
[55,] NA NA NA NA NA NA NA NA NA
[56,] NA NA NA NA NA NA NA NA NA
[57,] NA NA NA NA NA NA NA NA NA
[58,] NA NA NA NA NA NA NA NA NA
[59,] NA NA NA NA NA NA NA NA NA
[60,] NA NA NA NA NA NA NA NA NA
[61,] NA NA NA NA NA NA NA NA NA
[62,] NA NA NA NA NA NA NA NA NA
[63,] NA NA NA NA NA NA NA NA NA
[64,] NA NA NA NA NA NA NA NA NA
[65,] NA NA NA NA NA NA NA NA NA
[66,] NA NA NA NA NA NA NA NA NA
[67,] NA NA NA NA NA NA NA NA NA
[68,] NA NA NA NA NA NA NA NA NA
[69,] NA NA NA NA NA NA NA NA NA
[70,] NA NA NA NA NA NA NA NA NA
[71,] NA NA NA NA NA NA NA NA NA
[72,] NA NA NA NA NA NA NA NA NA
[73,] NA NA NA NA NA NA NA NA NA
[74,] NA NA NA NA NA NA NA NA NA
[75,] NA NA NA NA NA NA NA NA NA
[76,] NA NA NA NA NA NA NA NA NA
[77,] NA NA NA NA NA NA NA NA NA
[78,] NA NA NA NA NA NA NA NA NA
[79,] NA NA NA NA NA NA NA NA NA
[80,] NA NA NA NA NA NA NA NA NA
[81,] NA NA NA NA NA NA NA NA NA
[82,] NA NA NA NA NA NA NA NA NA
[83,] NA NA NA NA NA NA NA NA NA
[84,] NA NA NA NA NA NA NA NA NA
[85,] NA NA NA NA NA NA NA NA NA
[86,] NA NA NA NA NA NA NA NA NA
[87,] NA NA NA NA NA NA NA NA NA
[88,] NA NA NA NA NA NA NA NA NA
[89,] NA NA NA NA NA NA NA NA NA
[90,] NA NA NA NA NA NA NA NA NA
[91,] NA NA NA NA NA NA NA NA NA
[92,] NA NA NA NA NA NA NA NA NA
[93,] NA NA NA NA NA NA NA NA NA
[94,] NA NA NA NA NA NA NA NA NA
[95,] NA NA NA NA NA NA NA NA NA
[96,] NA NA NA NA NA NA NA NA NA
[97,] NA NA NA NA NA NA NA NA NA
[98,] NA NA NA NA NA NA NA NA NA
[99,] NA NA NA NA NA NA NA NA NA
[100,] NA NA NA NA NA NA NA NA NA
[101,] NA NA NA NA NA NA NA NA NA
[102,] NA NA NA NA NA NA NA NA NA
[103,] NA NA NA NA NA NA NA NA NA
[104,] NA NA NA NA NA NA NA NA NA
[105,] NA NA NA NA NA NA NA NA NA
[106,] NA NA NA NA NA NA NA NA NA
[107,] NA NA NA NA NA NA NA NA NA
[108,] NA NA NA NA NA NA NA NA NA
[109,] NA NA NA NA NA NA NA NA NA
[110,] NA NA NA NA NA NA NA NA NA
[111,] NA NA NA NA NA NA NA NA NA
[ reached getOption("max.print") -- omitted 889 rows ]
I want to name the columns of a matrix by using a string and a vector of length of the rows. As an example:
k<-c(5:15)
xMin = 3
xMax = 15
x<-c(xMin:xMax)
M<-matrix(, nrow = length(x), ncol = length(k))
Ideally, I would like to name the matrix columns using a string and the vector k, where the column name of the i'th column is the same as the item at the i'th position of the vector k.
So, I would like it to look like is this:
S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15
[1,] NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA
[7,] NA NA NA NA NA NA NA NA NA NA NA
[8,] NA NA NA NA NA NA NA NA NA NA NA
[9,] NA NA NA NA NA NA NA NA NA NA NA
[10,] NA NA NA NA NA NA NA NA NA NA NA
[11,] NA NA NA NA NA NA NA NA NA NA NA
[12,] NA NA NA NA NA NA NA NA NA NA NA
[13,] NA NA NA NA NA NA NA NA NA NA NA
where the string would be "S".
Couriously, what didn't work was:
N=NULL
N<- as.vector(N)
m=1
for (m in length(k))
{
N[m]<-paste0("s_",k[m])
}
N
=> The output was a vector full of NA's!
Although, when I iterated 'm' by hand, it worked (WHY is it not working in the loop?)!
Whatever, what I wanted to get, was of course:
> N
[1] "s_5" "s_6" "s_7" "s_8" "s_9" "s_10" "s_11" "s_12"
[9] "s_13" "s_14" "s_15"
which i could easily use for:
colnames(M)<-N
I would of course want to use the same procedure for naming the rows.
You don't need a loop for this. paste is vectorized.
k = seq(from = 5, to = 15)
paste("s", k, sep = "_")
or
paste0("s_", k)
However, if you are curious why the loop fails it is because you aren't actually looping over anything besides the result of length. Hence the NA values in the other vector elements. You need to have something to iterate over for a loop. In this case you could use something simple like seq(length(k)) or seq_along.
for (m in seq_along(k))
{
N[m]<-paste0("s_",k[m])
}
I have been trying to solve the following problem.
Suppose I have the following vector:
aux1<-c(0,0,0,4,5,0,7,0,0,10,11,12) where the numbers represent the number of the row.
I want to calculate the distance between the differents elements of this vector fixing the first component, then the second and so on.
If the element is zero, I do not want to count it, so I put a NA instead. The output I want should look like this:
NA NA NA NA NA
NA NA NA NA NA
NA NA NA NA NA
NA NA NA NA NA
1 NA NA NA NA
NA NA NA NA NA
3 2 NA NA NA
NA NA NA NA NA
NA NA NA NA NA
6 5 3 NA NA
7 6 4 1
8 7 5 2 1
In the first column, I have the difference between the first element different from zero and all other elements, i.e., Matrix[5,1]=5-4=1 and Matrix[12,1]=12-4=8. Also, Matrix[7,2]=7-5=2, where 5 is the second element in the vector non-equal to zero. Notice that Matrix[10,3]=10-7=3, where 7 is third element non-equal to zero, but the seventh element in my vector.
I have tried to do this in a loop. My current code looks like this:
M=matrix(nrow=N-1, ncol=N-1))
for (i in 1:N-1){
for (j in 1:N-1){
if(j<=i)
next
else
if(aux1[j]>0)
M[j,i]=aux1[j]-aux1[i]
else
M[j,i]=0
}
}
Unfortunately. I have not been able to solve my problem. Any help would be greatly appreciated.
You could try something like the following (with generous help from #thela)
res <- outer(aux1, head(aux1[aux1 > 0], -1), `-`)
is.na(res) <- res <= 0
# [,1] [,2] [,3] [,4] [,5]
# [1,] NA NA NA NA NA
# [2,] NA NA NA NA NA
# [3,] NA NA NA NA NA
# [4,] NA NA NA NA NA
# [5,] 1 NA NA NA NA
# [6,] NA NA NA NA NA
# [7,] 3 2 NA NA NA
# [8,] NA NA NA NA NA
# [9,] NA NA NA NA NA
# [10,] 6 5 3 NA NA
# [11,] 7 6 4 1 NA
# [12,] 8 7 5 2 1
Using sapply and ifelse :
sapply(head(vv[vv>0],-1),function(y)ifelse(vv-y>0,vv-y,NA))
You loop over the positive values (you should also remove the last element), then you extract each value from the original vector. I used ifelse to replace negative values.
# [,1] [,2] [,3] [,4] [,5]
# [1,] NA NA NA NA NA
# [2,] NA NA NA NA NA
# [3,] NA NA NA NA NA
# [4,] NA NA NA NA NA
# [5,] 1 NA NA NA NA
# [6,] NA NA NA NA NA
# [7,] 3 2 NA NA NA
# [8,] NA NA NA NA NA
# [9,] NA NA NA NA NA
# [10,] 6 5 3 NA NA
# [11,] 7 6 4 1 NA
# [12,] 8 7 5 2 1
I'm trying to create a vector using data from my data frame which contains all of the numeric values in the data frame.
Basically, I want a vector that has (2,2,5,2,2,3,2,3,2,2,2,2,2).
two three four five six seven
2 NA NA NA NA NA
2 NA NA NA NA NA
NA NA NA 5 NA NA
2 NA NA NA NA NA
2 NA NA NA NA NA
NA 3 NA NA NA NA
2 NA NA NA NA NA
NA 3 NA NA NA NA
2 NA NA NA NA NA
2 NA NA NA NA NA
2 NA NA NA NA NA
2 NA NA NA NA NA
2 NA NA NA NA NA
Just subset the dataframe for non-NA values with !is.na(df):
df <- data.frame(two = c(2, 2, NA),
three = c(NA, NA, NA),
four = c(NA, 3, NA))
df
# two three four
# 1 2 NA NA
# 2 2 NA 3
# 3 NA NA NA
is.na(df)
# two three four
# [1,] FALSE TRUE TRUE
# [2,] FALSE TRUE FALSE
# [3,] TRUE TRUE TRUE
df[!is.na(df)]
# [1] 2 2 3