I've got a dataset like the following.
df <- read.table(header=TRUE, text="
T_A_01_F_1 T_A_02_F_1 T_A_03_F_1 T_A_01_F_2 T_A_02_F_2 T_A_03_F_2 T_A_01_U_1 T_A_02_U_1 T_A_03_U_1 T_A_01_U_2 T_A_02_U_2 T_A_03_U_2 T_B_01_F_1 T_B_02_F_1 T_B_03_F_1 T_B_01_F_2 T_B_02_F_2 T_B_03_F_2 T_B_01_U_1 T_B_02_U_1 T_B_03_U_1 T_B_01_U_2 T_B_02_U_2 T_B_03_U_2
1 2 3 NA NA NA 2 2 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 2 5 NA NA NA 1 3 3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
5 3 3 NA NA NA 2 1 2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 4 5 NA NA NA 6 3 4 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA 4 3 5 NA NA NA 4 3 2 NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA 4 4 5 NA NA NA 2 1 1 NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA 3 1 4 NA NA NA 2 1 7 NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA 2 1 6 NA NA NA 3 3 6 NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA 1 1 1 NA NA NA 2 3 1 NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA 2 1 1 NA NA NA 3 2 2 NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA 3 2 1 NA NA NA 4 2 1 NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA 2 5 4 NA NA NA 6 1 4 NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 3 2 2 NA NA NA 1 2 5
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 4 4 NA NA NA 3 3 5
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 4 4 NA NA NA 1 3 5
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 1 3 NA NA NA 7 5 1
")
In this case its a 2x2x2 mixed design with "T" being the variable of interest with 3 items, "A" and "B" the between factor, "F" and "U" the within factor and "1" and "2" the between factor. I'd like to reduce the dataset, so that I can compute a cronbachs alpha.
As every Person either got A or B and either 1 or 2 I'd like to combine those items, so that I only have the items T_01_F, T_01_U, T_02_F, T_02_U, T_03_F, T_03_U
I could do this by hand, but does somebody know a quick command with which I could do that?
Thank you so much in advance!!
best, Nash
Perhaps a combination of pivot_longer() and separate() might work since all your column names appear to share the same structure.
library(tidyverse)
df<- df %>%
rownames_to_column() %>%
pivot_longer(cols = T_A_01_F_1:T_B_03_U_2) %>%
separate(col = name, sep = "_", into = c("t", "a_b", "number" , "within", "between"))
Related
I have a data frame like this:
> head(mt)
FID IID PLATE 0VXC556 1CNF297 1CWO500 1DXJ626 1LTX827 1SHK635 1TNP840
1 fam0110 G110 4RWG569 NA NA NA NA NA NA NA
2 fam0113 G113 cherry NA NA NA NA NA NA NA
3 fam0114 G114 cherry NA NA NA NA NA NA NA
4 fam0117 G117 4RWG569 NA NA NA NA NA NA NA
5 fam0118 G118 5XAV049 NA NA NA NA NA NA NA
6 fam0119 G119 cherry NA NA NA NA NA NA NA
1URP242 2BKX529 2PAG415 3DEF425 3ECO791 3FQM386 3KYJ479 3XHK903 4RWG569
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
5AMJ101 5AVC089 5GBM583 5XAV049 5ZCV995 6KAE204 6PKP514 6WZD253 7FDZ321
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
7MFL836 7PNN733 7RUZ165 8WWR250 9GXO476 9QYW461 9RHL593 9TKZ501 cherry
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
...
how do I replace every NA i every column with 2 if the column name matches row value in mt$PLATE and with 1 if that is not true?
for example the first row of mt would only have mt$4RWG569==2 and every other column would be equal 1 in that row.
I tried doing this:
idxs <- t(mapply(cbind, match(colnames(mt), mt$PLATE)))
but then when I tried to this:
> mt[idxs] <- "2"
Error in `[<-.data.frame`(`*tmp*`, idxs, value = "2") :
unsupported matrix index in replacement
it seems that this line solves it:
for(i in 4:ncol(mt)) mt[,i] <- 1 + (names(mt)[i]== mt$PLATE)
I am trying to knit a codebook with R markdown and the package "codebook".
But when I click "knit" the following error occurs:
[...]
Could not summarize item pfbp. Error: Argument one must be a data frame or a named atomic vector.
[...]
I don't want to copy the whole code in here, but that's the summary of item pfbp:
> codebook_data$pfbp
<Labelled integer>: personal financial benefits decrease in productivity
[1] NA NA NA NA NA NA NA 2 NA NA NA NA NA NA NA NA NA NA NA NA 4 NA NA NA NA NA NA NA
[29] NA NA NA NA NA 4 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5
[57] NA 0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 NA NA NA 3 2 1 NA NA NA NA NA
[85] NA NA NA NA NA NA NA NA NA NA NA 5 NA NA NA NA NA 5 NA 4 1 NA NA NA NA NA NA NA
[113] NA NA NA NA NA NA 3 3 NA NA NA 5 NA NA NA NA NA NA NA 5 NA NA NA NA NA NA NA NA
[141] NA NA NA NA NA 5 NA NA 3 4 4 NA NA NA 5 5 NA NA NA 4 NA NA NA NA NA NA NA NA
[169] NA NA 4 NA NA NA NA NA NA 4 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[197] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 NA 3 NA 5 NA NA NA NA 5 4
[225] NA NA 1 NA NA 2 NA NA NA NA NA NA NA NA NA 5 NA NA NA NA 2 5 NA 5 NA NA NA NA
[253] NA NA NA NA NA NA NA 4 5 NA 3 NA NA NA NA NA NA NA NA NA NA NA NA NA 5 NA NA NA
[281] NA NA NA NA 5 NA NA NA 4 NA NA 1 4 NA NA NA NA NA 5 NA NA 5 NA NA NA NA NA NA
[309] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 3 NA NA NA NA NA
[337] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[365] NA NA 2 NA NA NA NA NA 3 NA NA NA NA NA 5 NA NA NA NA NA NA NA NA 2 NA NA NA 2
[393] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 4 NA 5 NA NA NA NA NA NA NA NA NA NA
[421] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 NA NA NA NA NA NA NA NA NA NA NA
[449] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 5 NA 4
[477] NA NA NA 4 NA NA NA NA NA NA NA NA NA 2 1 NA NA NA NA NA NA NA NA NA NA NA NA NA
[505] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[533] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 5 NA NA 4 NA NA NA NA NA NA NA 5
[561] NA 5 4 5
Labels:
value label
1 Trifft nicht zu
2 Trifft eher nicht zu
3 teils-teils
4 Trifft eher zu
5 Trifft zu
0 Weiß nicht
> summary(codebook_data$pfbp)
[0] Weiß nicht [1] Trifft nicht zu [2] Trifft eher nicht zu
1 5 8
[3] teils-teils [4] Trifft eher zu [5] Trifft zu
8 17 29
NA's
496
> class(codebook_data$pfbp)
[1] "haven_labelled"
I don't understand this error message. Do you have any ideas?
I am still quite new to R and I am trying to complete the data wrangling but I am little bit stuck.
I have my data in R organized in the following data frame format (dimensions [24,17]):
Id a b c d e f g h i j k k m n o p
1 999 2 2 999 999 999 999 2 2 2 2 2 2 999 999 999
2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
8 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
9 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999
10 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
11 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
12 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
13 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
14 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
15 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
17 1 3 4 999 2 999 999 999 2 999 999 999 2 2 2 999
18 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
19 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
20 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
21 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
22 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
23 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
24 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
What I try to achieve is to have one column filled with the values for every 8th row (starting from row 1, so row 1,9,17 etc.) where the values other than 999 will be copied below each other in the single column. Where the row only consists of 999 values, I want 8 times 999 below each other in the column. In this particular example with 24 rows the column will be filled (based on row 1, 9, 17) as follows with dimensions [1,24]:
2
2
2
2
2
2
2
2
999
999
999
999
999
999
999
999
1
3
4
2
2
2
2
2
This means that I have to iterate through every column, starting with column 1, row 1 until the end of all columns in row 1 and than move to row 9 column 1 until the end of all columns in row 9 etc.
I looked at examples in R transposing rows to columns with conditions, but I was not able to get the job done.
Given my lack of knowledge here, does someone knows a way to get this done in R?
We can first extract the relevant rows using seq.
df1 <- df[seq(1, nrow(df), 8), ]
Then using apply row-wise we can check if all the values in that row is 999 and return the output accordingly.
c(apply(df1, 1, function(x) if(all(x == 999)) rep(999, 8) else x[x != 999][1:8]))
#[1] 2 2 2 2 2 2 2 2 999 999 999 999 999 999 999 999 1 3 4 2 2 2 2 2
If needed as one column dataframe, we can wrap data.frame around this output.
I have vector of values(generated from raster - Raster package - by function clump in R):
values(rc)
1 NA NA NA 2 NA 2 2 NA NA NA NA NA NA NA 2 NA 2 2 NA 2 2 NA NA NA
NA NA NA NA 2 NA NA NA NA NA 3 NA 4 NA 2 NA 2 NA 5 NA NA 3 NA NA 4
NA NA 2 NA NA NA NA NA NA NA NA 4 NA NA NA NA NA NA 6 NA 7 NA 4 NA NA
NA 8 8 NA 6 6 NA NA NA NA 4 NA NA NA NA NA NA NA NA 4 4 4 NA NA 9
NA NA NA NA 10 NA NA NA NA 4 NA 9 9 NA NA NA NA 10 NA NA NA 4 NA NA NA
9 NA NA NA NA NA NA NA NA NA 11 NA NA NA 12 NA NA NA NA
and I would like to find every value which occurs only once(so 1,5,11,10) and replace it by NA. What I would like to obtain:
values(replaced_rc)
NA NA NA NA 2 NA 2 2 NA NA NA NA NA NA NA 2 NA 2 2 NA 2 2 NA NA NA
NA NA NA NA 2 NA NA NA NA NA 3 NA 4 NA 2 NA 2 NA NA NA NA 3 NA NA 4
NA NA 2 NA NA NA NA NA NA NA NA 4 NA NA NA NA NA NA 6 NA NA NA 4 NA NA
NA 8 8 NA 6 6 NA NA NA NA 4 NA NA NA NA NA NA NA NA 4 4 4 NA NA 9
NA NA NA NA 10 NA NA NA NA 4 NA 9 9 NA NA NA NA 10 NA NA NA 4 NA NA NA
9 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
The problem is that I can easily identify raster patches by function clump. And I would like to exclude patches containing only pixel, similarly like function "sieve" in ENVI or ERDAS. Any help? Thanks a lot in advance.
Exemple from R:
library("raster")
r <- raster(ncols=12, nrows=12)
set.seed(0)
r[] <- round(runif(ncell(r))*0.7 )
plot(r)
rc <- clump(r)
replaced_rc<- ???
Using duplicated:
values(rc)[!duplicated(values(rc)) & !duplicated(values(rc),fromLast=T)] <- NA
I have the following data :
as.integer(datIn$Measurement.location)
myfunctionSD <- function(mydata) { return(sd(mydata,na.rm=TRUE))}
Alltubes <- tapply(datIn$Material.loss.interval,list(as.factor(datIn$Measurement.location),as.factor(datIn$Tube.number)),myfunctionSD)
From this I get the following output table:
1 2 3 4 5 6
1 0.8710740 0.7269928 0.8151022 0.6397234 0.8670634 0.7042107
10 NA 0.8075675 NA NA NA NA
11 0.6977951 NA 1.0984465 1.1148588 1.2156506 0.9620030
12 NA 0.5986758 NA NA NA NA
13 0.8386249 NA 0.8398164 0.8833184 1.2469221 1.0070322
14 NA 0.5109903 NA NA NA NA
15 NA NA NA 0.9391486 1.3571094 0.8375686
16 NA 0.5761583 NA NA NA NA
17 NA NA NA NA 1.0100850 0.7171070
19 NA NA NA NA 0.5913518 NA
3 0.5580579 0.6106961 0.8971073 0.7046614 0.8456784 0.8001571
4 NA 0.7228325 NA NA NA NA
5 0.9318795 NA 0.8961706 0.7753733 0.5915633 1.0471933
6 NA 0.5968613 NA NA NA NA
7 0.7674944 NA 0.7196781 0.8543926 0.7778685 0.8697442
8 NA 0.6283008 NA NA NA NA
9 1.3687895 NA 0.8815196 1.1723445 1.1589998 0.8194962
How do I rearrange the row numbers in the correct numeric order, so from 1 to 19 so I can plot it correctly?
Hope someone can help me.
Something like this...
> Alltubes[sort(as.numeric(rownames(Alltubes))), ]
df2 is your data frame
df2[order(as.numeric(rownames(df2))),]
X1 X2 X3 X4 X5 X6
1 0.8710740 0.7269928 0.8151022 0.6397234 0.8670634 0.7042107
3 0.5580579 0.6106961 0.8971073 0.7046614 0.8456784 0.8001571
4 NA 0.7228325 NA NA NA NA
5 0.9318795 NA 0.8961706 0.7753733 0.5915633 1.0471933
6 NA 0.5968613 NA NA NA NA
7 0.7674944 NA 0.7196781 0.8543926 0.7778685 0.8697442
8 NA 0.6283008 NA NA NA NA
9 1.3687895 NA 0.8815196 1.1723445 1.1589998 0.8194962
10 NA 0.8075675 NA NA NA NA
11 0.6977951 NA 1.0984465 1.1148588 1.2156506 0.9620030
12 NA 0.5986758 NA NA NA NA
13 0.8386249 NA 0.8398164 0.8833184 1.2469221 1.0070322
14 NA 0.5109903 NA NA NA NA
15 NA NA NA 0.9391486 1.3571094 0.8375686
16 NA 0.5761583 NA NA NA NA
17 NA NA NA NA 1.0100850 0.7171070
19 NA NA NA NA 0.5913518 NA