Matrix in julia gives column output - julia
Perhaps I am missing something, but consider the next matrix:
julia> a = [[0,1,1,1,1,0,0,0,1] [1,0,1,0,1,1,1,0,0] [1,1,0,0,0,0,1,1,1]
[1,0,0,0,1,0,0,0,0] [1,1,0,1,0,0,0,0,0] [0,1,0,0,0,0,1,0,0]
[0,1,1,0,0,0,0,0,1] [0,0,1,0,0,0,0,0,1] [1,0,1,0,0,0,0,1,0]]
9x9 Array{Int64,2}:
0 1 1 1 1 0 0 0 1 # <-- [0,1,1,1,1,0,0,0,1]
1 0 1 0 1 1 1 0 0 # <-- [1,0,1,0,1,1,1,0,0]
1 1 0 0 0 0 1 1 1 # <-- [1,1,0,0,0,0,1,1,1]
1 0 0 0 1 0 0 0 0 # <-- [1,0,0,0,1,0,0,0,0]
1 1 0 1 0 0 0 0 0 # <-- [1,1,0,1,0,0,0,0,0]
0 1 0 0 0 0 0 0 0 # <-- [0,1,0,0,0,0,1,0,0] ***
0 1 1 0 0 1 0 0 0 # <-- [0,1,1,0,0,0,0,0,1] ***
0 0 1 0 0 0 0 0 1 # <-- [0,0,1,0,0,0,0,0,1]
1 0 1 0 0 0 1 1 0 # <-- [1,0,1,0,0,0,0,1,0] ***
The output provided by julia is wrong, right?
That notation means that you're building up an array by columns, not rows:
julia> a = [[1,2] [3,4]]
2x2 Array{Int64,2}:
1 3
2 4
julia> a = [[1 2];[3 4]]
2x2 Array{Int64,2}:
1 2
3 4
And so you're getting the transpose of the array you think you are.
Related
Creating a repeated sequence of zero and ones with uneven "breaks" between
I am trying to create a sequence consisting of 1 and 0 using Rstudio. My desired output is a sequence that first has five 1 then six 0, followed by four 1 then six 0. Then this should all be repeat until the end of a given vector. The result should be like this: 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 ..... Hope someone has a good solution, and sorry if I have some grammar mistakes Best, HB
rep(c(rep(1,5),rep(0,6),rep(1,4),rep(0,6)),n) repeating your pattern n times.
You could use Map. unlist(Map(function(x, ...) c(rep(x, ...), rep(0, 6)), 1, times=length(v):1)) # [1] 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 Instead of length(v):1 you may also use rev(seq(v)) but it's slower. Data v <- c("Vector", "of", "specific", "length", "five")
Building a symmetric binary matrix
I have a matrix that is for example like this: rownames V1 a 1 c 3 b 2 d 4 y 2 q 4 i 1 j 1 r 3 I want to make a Symmetric binary matrix that it's dimnames of that is the same as rownames of above matrix. I want to fill these matrix by 1 & 0 in such a way that 1 indicated placing variables that has the same number in front of it and 0 for the opposite situation.This matrix would be like dimnames a c b d y q i j r a 1 0 0 0 0 0 1 1 0 c 0 1 0 0 0 0 0 0 1 b 0 0 1 0 1 0 0 0 0 d 0 0 0 1 0 1 0 0 0 y 0 0 1 0 1 0 0 0 0 q 0 0 0 1 0 1 0 0 0 i 1 0 0 0 0 0 1 1 0 j 1 0 0 0 0 0 1 1 0 r 0 1 0 0 0 0 0 0 1 Anybody know how can I do that?
Use dist: DF <- read.table(text = "rownames V1 a 1 c 3 b 2 d 4 y 2 q 4 i 1 j 1 r 3", header = TRUE) res <- as.matrix(dist(DF$V1)) == 0L #alternatively: #res <- !as.matrix(dist(DF$V1)) #diag(res) <- 0L #for the first version of the question, i.e. a zero diagonal res <- +(res) #for the second version, i.e. to coerce to an integer matrix dimnames(res) <- list(DF$rownames, DF$rownames) # 1 2 3 4 5 6 7 8 9 #1 1 0 0 0 0 0 1 1 0 #2 0 1 0 0 0 0 0 0 1 #3 0 0 1 0 1 0 0 0 0 #4 0 0 0 1 0 1 0 0 0 #5 0 0 1 0 1 0 0 0 0 #6 0 0 0 1 0 1 0 0 0 #7 1 0 0 0 0 0 1 1 0 #8 1 0 0 0 0 0 1 1 0 #9 0 1 0 0 0 0 0 0 1
You can do this using table and crossprod. tcrossprod(table(DF)) # rownames # rownames a b c d i j q r y # a 1 0 0 0 1 1 0 0 0 # b 0 1 0 0 0 0 0 0 1 # c 0 0 1 0 0 0 0 1 0 # d 0 0 0 1 0 0 1 0 0 # i 1 0 0 0 1 1 0 0 0 # j 1 0 0 0 1 1 0 0 0 # q 0 0 0 1 0 0 1 0 0 # r 0 0 1 0 0 0 0 1 0 # y 0 1 0 0 0 0 0 0 1 If you want the row and column order as they are found in the data, rather than alphanumerically, you can subset tcrossprod(table(DF))[DF$rownames, DF$rownames] or use factor tcrossprod(table(factor(DF$rownames, levels=unique(DF$rownames)), DF$V1)) If your data is large or sparse, you can use the sparse matrix algebra in xtabs, with similar ways to change the order of the resulting table as before. Matrix::tcrossprod(xtabs(data=DF, ~ rownames + V1, sparse=TRUE))
R: column reference to itself
Please, help! I have w: x y 0 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 -1 0 0 0 0 I would like to get: x y 0 0 0 0 0 0 1 1 1 0 1 0 0 -1 0 0 0 0 1 1 1 0 0 -1 0 0 0 0 I use R: for (i in 2:length(w$x)) { w$x[i] = w$x[i-1] + w$y[i]} Is it possible to do without the use of a loop statement? Thank you!
This assumes that you want to start with the initial value of 0 in the x column: transform(w, x = cumsum(y)) ## x y ## 1 0 0 ## 2 0 0 ## 3 0 0 ## 4 1 1 ## 5 1 0 ## 6 1 0 ## 7 0 -1 ## 8 0 0 ## 9 0 0 ## 10 1 1 ## 11 1 0 ## 12 0 -1 ## 13 0 0 ## 14 0 0 Otherwise you can include the initial value: transform(w, x = x[1] + cumsum(y)) The result here is the same. Both of these assume that either y[1] is zero, or that you want to use the actual value if it is nonzero (your code ignores y[1]).
Retrieve values in each cluster in R
I have successfully run the DBSCAN algorithm (here is the stripped down command): results <- dbscan(data,MinPts=15, eps=0.01) and plotted my clusters: plot(results, data) results$cluster returns a list with numeric values. The value at each index reflects the cluster to which the original data in that index belongs: [1] 0 1 2 1 0 0 2 1 0 0 0 1 2 0 2 0 2 0 0 1 2 0 2 2 0 1 2 0 1 0 1 0 2 0 0 0 1 1 0 1 2 0 0 0 1 0 0 1 1 0 1 [52] 0 2 2 0 0 1 2 2 0 2 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 2 2 2 2 2 0 0 0 0 0 2 1 2 1 0 2 0 0 1 1 1 0 0 1 [103] 2 1 1 0 1 0 1 1 0 0 0 0 1 2 0 0 1 1 1 1 0 0 0 1 0 0 2 2 1 1 0 1 2 1 0 0 1 0 1 2 0 0 2 0 0 2 2 2 2 0 1 However, how can I retrieve the values of the original data that is in each cluster? For example, how can I get all the values from the original data that are in cluster #2?
Okay, this should do the trick for, e.g., cluster #2: data[results$cluster==2,]
How can I calculate an empirical CDF in R?
I'm reading a sparse table from a file which looks like: 1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 3 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1 Note row lengths are different. Each row represents a single simulation. The value in the i-th column in each row says how many times value i-1 was observed in this simulation. For example, in the first simulation (first row), we got a single result with value '0' (first column), 7 results with value '2' (third column) etc. I wish to create an average cumulative distribution function (CDF) for all the simulation results, so I could later use it to calculate an empirical p-value for true results. To do this I can first sum up each column, but I need to take zeros for the undef columns. How do I read such a table with different row lengths? How do I sum up columns replacing 'undef' values with 0'? And finally, how do I create the CDF? (I can do this manually but I guess there is some package which can do that).
This will read the data in: dat <- textConnection("1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 3 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1") df <- data.frame(scan(dat, fill = TRUE, what = as.list(rep(1, 29)))) names(df) <- paste("Val", 1:29) close(dat) Resulting in: > head(df) Val 1 Val 2 Val 3 Val 4 Val 5 Val 6 Val 7 Val 8 Val 9 Val 10 Val 11 Val 12 1 1 0 7 0 0 1 0 0 0 5 0 0 2 1 0 0 1 0 0 0 3 0 0 0 0 3 0 0 0 1 0 0 0 2 0 0 0 0 4 1 0 0 1 0 3 0 0 0 0 1 0 5 0 0 0 1 0 0 0 2 0 0 0 0 .... If the data are in a file, provide the file name instead of dat. This code presumes that there are a maximum of 29 columns, as per the data you supplied. Alter the 29 to suit the real data. We get the column sums using df.csum <- colSums(df, na.rm = TRUE) the ecdf() function generates the ECDF you wanted, df.ecdf <- ecdf(df.csum) and we can plot it using the plot() method: plot(df.ecdf, verticals = TRUE)
You can use the ecdf() (in base R) or Ecdf() (from the Hmisc package) functions.