I want to perform t-test for two columns, "income" and "coupon". Before running the commands, I first look at the structure of the two columns. The output is as follows:
$ gender : chr "male" "male" "female" "male" ...
$ income : chr "Low Income" "Low Income" "Low Income" "Low Income" ...
Then, I perform the t.test t.test(income~gender,mydata).
Error message is resulted.
Error in if (stderr < 10 * .Machine$double.eps * max(abs(mx), abs(my))) stop("data are essentially constant") :
missing value where TRUE/FALSE needed
I have searched this issue online and try the solution. as.numeric(as.character(mydata$income)). However, all the data become NA.
[1] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [49] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [97] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [145] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [193] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [241] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [289] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [385] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [433] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [481] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [529] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [577] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [625] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [673] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [721] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [769] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [817] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [865] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [913] 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [961] 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 NA NA NA NA NA NA NA NA NA NA NA NA [ reached getOption("max.print") -- omitted 4119 entries ]
How can I solve this problem?
The first thing to do is decide which test is the best fit for your data. As you are working with categorical variables you should use a chi square test.
chisq.test(data$gender, data$income)
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)
This question already has answers here:
How can I assign a value using if-else conditions in R
(2 answers)
Closed 3 years ago.
I created a new variable "house_group" in my dataset filenamed "adoption". I want entries in "house_group" to be 0 or 1 based on a condition: If education (another variable in the dataset) is 1, house_group should be 1. But if education is 2, house_group should be 0. I used following ifelse function. But it returns NA for the new variable house_group. The options in variable "education" are 1 and 2, and they are categorical not continuous. I want House_group options 1 and 0 as categorical. Any help?
adoption$house_group<-NA
ifelse(adoption$education=="1",adoption$house_group=="1", adoption$house_group=="0")
[1] 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 NA NA NA
[32] 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 NA NA NA
[63] 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 NA NA NA
[94] 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 NA NA NA
[125] 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 NA NA NA
[156] 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 NA NA NA
[187] 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 NA NA NA
[218] 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 NA NA NA
[249] 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 NA NA NA
[280] 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 NA NA NA
[311] 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 NA NA NA
[342] 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 NA NA NA
[373] 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 NA NA NA
[404] 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 NA NA NA
[435] 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 NA NA NA
[466] 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 NA NA NA
[497] NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Here's one way to solve this using data.frame masking. Selecting the correct rows and column you want and then replacing those NA's in groups.
df <- as.data.frame(sample(1:2,10,replace=TRUE))
colnames(df) <- c('education')
df$house_group <- NA
df[df$education == 1,'house_group'] <- 1
df[df$education == 2,'house_group'] <- 0
Another way using your ifelse logic. The problem being that you aren't using the assignment operator "<-" in your ifelse function above.
df$house_group <- ifelse(df$education=="1", 1, 0)
I have seen the question here R apply user define function on data frame columns but mine is a little different...
I would like to pass specific columns of my dataframe to a function, then return the result of that function to a new column of my dataframe.
Basically, I have a dataframe like this:
df.latitude1
df.longitude1
df.latitude2
df.longitude2
Then I have a method getDistance(lat1, lng1, lat2, lng2) and I would like to return the result of that computation into a new column in my dataframe called distance.
Update
> asn$geoDistance <- distHaversine(asn[,c("homeLocationGeoLat", "homeLocationGeoLng")], dat[,c("hostLocationGeoLat", "hostLocationGeoLng")])
Error in .pointsToMatrix(p1) : latitude < -90
> asn$homeLocationGeoLat[asn$homeLocationGeoLat < -90]
[1] 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 NA NA NA NA NA NA NA NA NA NA NA
[40] 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 NA NA NA NA NA NA NA NA NA NA NA
[79] 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 NA NA NA NA NA NA NA NA NA NA NA
[118] 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 NA NA NA NA NA NA NA NA NA NA NA
[157] 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 NA NA NA NA NA NA NA NA NA NA NA
[196] 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 NA NA NA NA NA NA NA NA NA NA NA
[235] 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 NA NA NA NA NA NA NA NA NA NA NA
[274] 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 NA NA NA NA NA NA NA NA NA NA NA
[313] 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 NA NA NA NA NA NA NA NA NA NA NA
[352] 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 NA NA NA NA NA NA NA NA NA NA NA
[391] 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 NA NA NA NA NA NA NA NA NA NA NA
[430] 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 NA NA NA NA NA NA NA NA NA NA NA
[469] 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 NA NA NA NA NA NA NA NA NA NA NA
[508] 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 NA NA NA NA NA NA NA NA NA NA NA
[547] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> asn$hostLocationGeoLat[asn$hostLocationGeoLat < -90]
[1] 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 NA NA NA NA NA NA NA NA NA NA NA
[40] 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 NA NA NA NA NA NA NA NA NA NA NA
[79] 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 NA NA NA NA NA NA NA NA NA NA NA
[118] 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 NA NA NA NA NA NA NA NA NA NA NA
[157] 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 NA NA NA NA NA NA NA NA NA NA NA
[196] 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 NA NA NA NA NA NA NA NA NA NA NA
[235] 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 NA NA NA NA NA NA NA NA NA NA NA
[274] 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 NA NA NA NA NA NA NA NA NA NA NA
[313] 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 NA NA NA NA NA NA NA NA NA NA NA
[352] 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 NA NA NA NA NA NA NA NA NA NA NA
[391] 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 NA NA NA NA NA NA NA NA NA NA NA
[430] 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 NA NA NA NA NA NA NA NA NA NA NA
[469] 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 NA NA NA NA NA NA NA NA NA NA NA
[508] 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 NA NA NA NA NA NA NA NA NA NA NA
[547] 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 NA NA NA NA NA NA NA NA NA NA NA
[586] 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 NA NA NA NA NA NA NA NA NA NA NA
[625] 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 NA NA NA NA NA NA NA NA NA NA NA
[664] 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 NA NA NA NA NA NA NA NA NA NA NA
[703] NA NA NA NA NA NA NA NA NA
> newDf <- asn[, c('durationDays', 'homeLocationGeoLat', 'homeLocationGeoLng', 'hostLocationGeoLat', 'hostLocationGeoLng')]
> dput(head(newDf))
structure(list(durationDays = c(0, 0, 180, 0, 365, 0), homeLocationGeoLat = c(-23.5489433,
1.2800945, 12.9715987, 25.7889689, 49.3063689, 25.271139), homeLocationGeoLng = c(-46.6388182,
103.8509491, 77.5945627, -80.2264393, 8.6427693, 55.307485),
hostLocationGeoLat = c(37.4418834, 49.2774456, 52.3905689,
49.3063689, 53.3498053, 37.4418834), hostLocationGeoLng = c(-122.1430195,
7.1118995, 13.0644729, 8.6427693, -6.2603097, -122.1430195
)), .Names = c("durationDays", "homeLocationGeoLat", "homeLocationGeoLng",
"hostLocationGeoLat", "hostLocationGeoLng"), row.names = c(NA,
6L), class = "data.frame")
Your best bet is probably to use a vectorized function and compute the distances for all pairs of points at the same time. For instance, you could use the distHaversine function from the geosphere package to do the calculation in one shot:
# 10000 points
set.seed(144)
dat <- data.frame(lat1=runif(10000, 10, 20), lng1=runif(10000, 10, 20),
lat2=runif(10000, 10, 20), lng2=runif(10000, 10, 20))
# Get all distances
library(geosphere)
dat$distance <- distHaversine(dat[,c("lng1", "lat1")], dat[,c("lng2", "lat2")])
head(dat$distance)
# [1] 293912.3 332583.2 870767.8 167362.9 371920.6 659368.1
If you were going to use a function from the apply family, you would probably loop through the rows of your data frame, computing the distances one at a time. While this will give the same answer, it will be much slower:
all.equal(distHaversine(dat[,c("lng1", "lat1")], dat[,c("lng2", "lat2")]),
apply(dat, 1, function(x) distHaversine(x[c("lng1", "lat1")], x[c("lng2", "lat2")])))
# [1] TRUE
system.time(distHaversine(dat[,c("lng1", "lat1")], dat[,c("lng2", "lat2")]))
# user system elapsed
# 0.005 0.001 0.008
system.time(apply(dat, 1, function(x) distHaversine(x[c("lng1", "lat1")], x[c("lng2", "lat2")])))
# user system elapsed
# 0.887 0.007 0.895
The reason for the 100x slowdown is that you can't take advantage of vectorization if you perform the distance computation one row at a time.
I have a big table in R with lots of NA values.
The first lines:
"tm1" "score1" "score2" "score3" "score4" "score5" "score6" "score7" "score8" "score9" "score10" "score11" "score12" "score13" "score14" "score15" "score16" "score17" "score18" "score19" "score20" "score21" "score22" "score23" "score24" "score25" "score26" "score27" "score28" "score29" "score30" "score31" "score32" "score33" "score34" "score35" "score36" "score37" "score38" "score39" "score40" "score41" "score42" "score43" "score44" "score45" "score46" "score47" "score48" "score49" "score50" "score51" "score52" "score53" "score54" "score55" "score56" "score57" "score58" "score59" "score60" "score61" "score62" "score63" "score64" "score65" "score66" "score67" "score68" "score69" "score70" "score71" "score72" "score73" "score74" "score75" "score76" "score77" "score78" "score79" "score80" "score81" "score82" "score83" "score84" "score85" "score86" "score87" "score88" "score89" "score90" "score91" "score92" "score93" "score94" "score95" "score96" "score97" "score98" "score99" "score100"
"1" 7289 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 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 35177.5 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
"2" 7290 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 37149 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 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
"3" 7296 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 NA NA NA NA NA NA NA NA 33172.3 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 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 NA NA NA NA NA NA NA
"4" 7297 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 45095.7 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 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
"5" 7298 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 44116.1 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
"6" 7300 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 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 37162.1 NA 36188.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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
"7" 7302 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 35188 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 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
"8" 7303 NA NA NA NA NA NA NA NA 37146.9 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 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 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 NA NA NA NA NA NA NA
"9" 7304 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 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 NA 41134.4 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 32172.8 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 35154.6 NA NA NA NA NA NA
"10" 7306 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 38147 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 NA NA NA NA NA NA NA NA NA 36155.7 NA NA 46104.1 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 NA NA NA NA NA NA
"11" 7308 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 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 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 33167.1 NA 27211.4 NA NA NA NA NA NA NA NA NA NA NA NA NA
"12" 7310 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 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 NA NA NA NA 46097.1 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 NA NA NA NA NA NA NA NA NA NA NA
I want to replace each scoreX NA value with the previously known value. I wanted to do it using locf from the zoo package:
newdata$score1 <- zoo::na.locf(newdata$score1 )
newdata$score2 <- zoo::na.locf(newdata$score2 )
newdata$score3 <- zoo::na.locf(newdata$score3 )
newdata$score4 <- zoo::na.locf(newdata$score4 )
newdata$score5 <- zoo::na.locf(newdata$score5 )
newdata$score6 <- zoo::na.locf(newdata$score6 )
newdata$score7 <- zoo::na.locf(newdata$score7 )
newdata$score8 <- zoo::na.locf(newdata$score8 )
newdata$score9 <- zoo::na.locf(newdata$score9 )
newdata$score10 <- zoo::na.locf(newdata$score10 )
newdata$score11 <- zoo::na.locf(newdata$score11 )
newdata$score12 <- zoo::na.locf(newdata$score12 )
newdata$score13 <- zoo::na.locf(newdata$score13 )
newdata$score14 <- zoo::na.locf(newdata$score14 )
newdata$score15 <- zoo::na.locf(newdata$score15 )
newdata$score16 <- zoo::na.locf(newdata$score16 )
newdata$score17 <- zoo::na.locf(newdata$score17 )
newdata$score18 <- zoo::na.locf(newdata$score18 )
newdata$score19 <- zoo::na.locf(newdata$score19 )
newdata$score20 <- zoo::na.locf(newdata$score20 )
newdata$score21 <- zoo::na.locf(newdata$score21 )
newdata$score22 <- zoo::na.locf(newdata$score22 )
newdata$score23 <- zoo::na.locf(newdata$score23 )
newdata$score24 <- zoo::na.locf(newdata$score24 )
newdata$score25 <- zoo::na.locf(newdata$score25 )
newdata$score26 <- zoo::na.locf(newdata$score26 )
newdata$score27 <- zoo::na.locf(newdata$score27 )
newdata$score28 <- zoo::na.locf(newdata$score28 )
newdata$score29 <- zoo::na.locf(newdata$score29 )
newdata$score30 <- zoo::na.locf(newdata$score30 )
newdata$score31 <- zoo::na.locf(newdata$score31 )
newdata$score32 <- zoo::na.locf(newdata$score32 )
newdata$score33 <- zoo::na.locf(newdata$score33 )
newdata$score34 <- zoo::na.locf(newdata$score34 )
newdata$score35 <- zoo::na.locf(newdata$score35 )
newdata$score36 <- zoo::na.locf(newdata$score36 )
newdata$score37 <- zoo::na.locf(newdata$score37 )
newdata$score38 <- zoo::na.locf(newdata$score38 )
newdata$score39 <- zoo::na.locf(newdata$score39 )
newdata$score40 <- zoo::na.locf(newdata$score40 )
newdata$score41 <- zoo::na.locf(newdata$score41 )
newdata$score42 <- zoo::na.locf(newdata$score42 )
newdata$score43 <- zoo::na.locf(newdata$score43 )
newdata$score44 <- zoo::na.locf(newdata$score44 )
newdata$score45 <- zoo::na.locf(newdata$score45 )
newdata$score46 <- zoo::na.locf(newdata$score46 )
newdata$score47 <- zoo::na.locf(newdata$score47 )
newdata$score48 <- zoo::na.locf(newdata$score48 )
newdata$score49 <- zoo::na.locf(newdata$score49 )
newdata$score50 <- zoo::na.locf(newdata$score50 )
newdata$score51 <- zoo::na.locf(newdata$score51 )
newdata$score52 <- zoo::na.locf(newdata$score52 )
newdata$score53 <- zoo::na.locf(newdata$score53 )
newdata$score54 <- zoo::na.locf(newdata$score54 )
newdata$score55 <- zoo::na.locf(newdata$score55 )
newdata$score56 <- zoo::na.locf(newdata$score56 )
newdata$score57 <- zoo::na.locf(newdata$score57 )
newdata$score58 <- zoo::na.locf(newdata$score58 )
newdata$score59 <- zoo::na.locf(newdata$score59 )
newdata$score60 <- zoo::na.locf(newdata$score60 )
newdata$score61 <- zoo::na.locf(newdata$score61 )
newdata$score62 <- zoo::na.locf(newdata$score62 )
newdata$score63 <- zoo::na.locf(newdata$score63 )
newdata$score64 <- zoo::na.locf(newdata$score64 )
newdata$score65 <- zoo::na.locf(newdata$score65 )
newdata$score66 <- zoo::na.locf(newdata$score66 )
newdata$score67 <- zoo::na.locf(newdata$score67 )
newdata$score68 <- zoo::na.locf(newdata$score68 )
newdata$score69 <- zoo::na.locf(newdata$score69 )
newdata$score70 <- zoo::na.locf(newdata$score70 )
newdata$score71 <- zoo::na.locf(newdata$score71 )
newdata$score72 <- zoo::na.locf(newdata$score72 )
newdata$score73 <- zoo::na.locf(newdata$score73 )
newdata$score74 <- zoo::na.locf(newdata$score74 )
newdata$score75 <- zoo::na.locf(newdata$score75 )
newdata$score76 <- zoo::na.locf(newdata$score76 )
newdata$score77 <- zoo::na.locf(newdata$score77 )
newdata$score78 <- zoo::na.locf(newdata$score78 )
newdata$score79 <- zoo::na.locf(newdata$score79 )
newdata$score80 <- zoo::na.locf(newdata$score80 )
newdata$score81 <- zoo::na.locf(newdata$score81 )
newdata$score82 <- zoo::na.locf(newdata$score82 )
newdata$score83 <- zoo::na.locf(newdata$score83 )
newdata$score84 <- zoo::na.locf(newdata$score84 )
newdata$score85 <- zoo::na.locf(newdata$score85 )
newdata$score86 <- zoo::na.locf(newdata$score86 )
newdata$score87 <- zoo::na.locf(newdata$score87 )
newdata$score88 <- zoo::na.locf(newdata$score88 )
newdata$score89 <- zoo::na.locf(newdata$score89 )
newdata$score90 <- zoo::na.locf(newdata$score90 )
newdata$score91 <- zoo::na.locf(newdata$score91 )
newdata$score92 <- zoo::na.locf(newdata$score92 )
newdata$score93 <- zoo::na.locf(newdata$score93 )
newdata$score94 <- zoo::na.locf(newdata$score94 )
newdata$score95 <- zoo::na.locf(newdata$score95 )
newdata$score96 <- zoo::na.locf(newdata$score96 )
newdata$score97 <- zoo::na.locf(newdata$score97 )
newdata$score98 <- zoo::na.locf(newdata$score98 )
newdata$score99 <- zoo::na.locf(newdata$score99 )
newdata$score100 <- zoo::na.locf(newdata$score100 )
I get an error, probably due to the fact the the first values do not have a previous value!
Error in $<-.data.frame(*tmp*, "score1", value = c(32189.8, 32189.8, :
replacement has 459744 rows, data has 459772
I guess I could rerun my experiment and add a nice tm1=0 value for each run, but I was wondering if there is a way to circumvent this. Say, leave the NA value for the rows that do not have a previous value?
You definitely must set some default value, if there is no value in front of first NA. In following example, I set it to 0.
# create new data.frame with score0 = 0 as first column
newdata <- data.frame(newdata$tm1, score0=rep(0,nrow(newdata)), newdata[,-1])
# apply function na.locf to every row
a <- t(apply(newdata[,-c(1)], 1, na.locf))
# append to original data.frame (this will keep the column score0)
newdata[,2:ncol(newdata)] <- a