I am trying to reshape this dataframe:
ID tag stemID spcode x y blk plotnum trt date1 dbh1 hom1 codes1 height1 canpos1 liana1 obs1 date2 dbh2 hom2 codes2 height2 canpos2 liana2 obs2 date3 dbh3 hom3 codes3 height3 canpos3 liana3 obs3 date4 dbh4 hom4 codes4 height4 canpos4 liana4 obs4 date5 dbh5 hom5 codes5 height5 canpos5 liana5 obs5 date6 dbh6 hom6 codes6 height6 canpos6 liana6 obs6 date7 dbh7 hom7 codes7 height7 canpos7 liana7 obs7 date8 dbh8 hom8 codes8 height8 canpos8 liana8 obs8 date9 dbh9 hom9 codes9 height9 canpos9 liana9 obs9
1 1 511141 acapol 21 470 NA 1 CL 1/1/1993 NA NA NA NA NA NA NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 20.10000 NA NA NA NA NA NA 1/1/2009 24.20 NA NA NA NA 1 NA
2 2 1406 SUB acapol 1 153 NA 14 CONTROL 1/1/1993 40.7 NA NA NA NA 2 NA 1/1/1994 41.30000 NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 NA NA NA NA NA NA NA 1/1/2009 NA NA NA NA NA NA
3 3 726 acapol 23 127 NA 10 RIL 1/1/1993 67.0 NA NA NA NA 3 NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 NA NA NA NA NA NA NA 1/1/2009 NA NA NA NA NA NA
4 4 51664 aconit 22 102 NA 18 CONTROL 1/1/1993 NA NA NA NA NA NA NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 10.40000 NA NA NA NA NA NA 1/1/2009 10.70 NA NA NA NA NA
5 5 5198 aconit 24 67 NA 3 CONTROL 1/1/1993 NA NA NA NA NA NA NA 1/1/1994 NA NA NA NA NA NA NA 1/1/1995 NA NA NA NA NA NA NA 1/1/1996 NA NA NA NA NA NA NA 1/1/1998 NA NA NA NA NA NA NA 1/1/2000 NA NA NA NA NA NA NA 1/1/2003 NA NA NA NA NA NA NA 1/1/2006 10.50000 NA NA NA NA NA NA 1/1/2009 10.70 NA NA NA NA NA
Editors note: This appears to have been tab separated data but the tabs were converted to spaces and it may be difficult to import. The poster should have posted output from dput(census).
I have used this code several times, but now it is giving me a error and, although it should be a really basic thing, I can't figure it out what is missing:
census.long.coarse =
reshape(census,
varying=list(c("date1","date2","date3","date4","date5","date6","date7","date8","data9"),
c("dbh1","dbh2","dbh3","dbh4","dbh5","dbh6","dbh7","dbh8","dbh9")),
v.names = c("date","dbh"),
direction = "long",
times = c(1,2,3,4,5,6,7,8,9))
The error that I am getting is:
Error in `[.data.frame`(data, , varying[[j]][i]) :
undefined columns selected
You made a typo (data9 instead of date9). Should work:
census.long.coarse = reshape(census,
varying=list(c("date1","date2","date3","date4","date5","date6","date7","date8","date9"),
c("dbh1","dbh2","dbh3","dbh4","dbh5","dbh6","dbh7","dbh8","dbh9")),
v.names = c("date","dbh"),
direction = "long",
times = c(1,2,3,4,5,6,7,8,9))
Related
I am trying to compare the equality of data and get an output of 1&0. To explain what I was trying to I have extracted the head of data to explain.
id illness_1 illness_2 illness_3 illness_4 illness_5 illness_6 illness_7 illness_8 illness_9 illness_10 illness_11
1 1 1065 1139 244 3120 NA NA NA NA NA NA NA
2 2 1111 1400 1309 NA NA NA NA NA NA NA NA
3 3 1439 NA NA NA NA NA NA NA NA NA NA
4 4 NA NA NA NA NA NA NA NA NA NA NA
5 5 1065 1113 NA NA NA NA NA NA NA NA NA
6 6 1309 NA NA NA NA NA NA NA NA NA NA
illness_12 illness_13 ICD9.Code Disutility.Score DC DC1 DC2 DC3 DC4 DC5 DC6 DC7 DC8 DC9 DC10 DC11 DC12 DC13
1 NA NA icd042 -0.0844983 1439 NA NA NA NA NA NA NA NA NA NA NA NA NA
2 NA NA icd135 -0.0957076 1359 135 1073 NA NA NA NA NA NA NA NA NA NA NA
3 NA NA icd149 -0.0278367 149 1490 1491 1492 1492 1494 1495 1499 NA NA NA NA NA NA
4 NA NA icd151 -0.0705565 151 1510 1512 1513 1514 1515 1519 NA NA NA NA NA NA NA
5 NA NA icd153 -0.0673908 NA NA NA NA NA NA NA NA NA NA NA NA NA NA
6 NA NA icd155 -0.0929452 NA NA NA NA NA NA NA NA NA NA NA NA NA NA
DC14 DC15 DC16 DC17 DC18 DC19 DC20 DC21 DC22 DC23 DC24 DC25 DC26 DC27 DC28 DC29 DC30 DC31 DC32 DC33 DC34 DC35 DC36 DC37
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
2 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 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 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 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
DC38 DC39 DC40 DC41 DC42 DC43 DC44 DC45 DC46 DC47 DC48 DC49 DC50 DC51 DC52 DC53 DC54 DC55 DC56 DC57 DC58 DC59 DC60 DC61
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
2 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 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 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 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
DC62 DC63 DC64 DC65 DC66 DC67 DC68 DC69 DC70 DC71 DC72 DC73 DC74 DC75 DC76 DC77 DC78 DC79 DC80 DC81 DC82 DC83 DC84 DC85
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
2 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 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 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 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 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
DC86 DC87 DC88 DC89 DC90 DC91 DC92 DC93 DC94 DC95 DC96 DC97 DC98 DC99 DC100
1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 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
4 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
6 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Different disease diagnosis are represented by a specific ICD code (icd in my dataset) in the medical field. Each ICD code is corresponded to one or more datacodes (all the DC in my dataset) in the UKbiobank.
What I am trying to do is to see is whether a patient has a particular disease. And create a logical column of 1&0s to indicate which patient (id in my dataset) has which disease.
If you refer to the third row, icd 149 has 7 different datacodes. A patient is considered having the disease if he or she matches any of the datacode.
What I have tried right now is
> ccc<- read.table(file.choose(), header=T, sep=",")
> ccc2<- ccc
> patient_illness <- dplyr::select(ccc2 ,contains("illness"))
> datacodes<- dplyr::select(
> ccc2, contains("DC")
> )
> for(i in datacodes) {
> equality<- data.frame(
> sapply(patient_illness, function(x) ifelse(x==i, 1, 0))
> )
> }
>
Which gives me all NAs. Do any of you know what I have done wrong?
The strings for all illness and datacode columns are integers. Sorry for not putting all the strings up here. I am a newbie and do not know how to use the site.
If I extract a few illness and datacodes columns out it will be as follows
illness_1 illness_2 illness_3 illness_4 ICD9.Code DC DC1 DC2
1 1065 1139 244 3120 icd042 1439 NA NA
2 1111 1400 1309 NA icd135 1359 135 1073
3 1439 NA NA NA icd149 149 1490 1491
4 NA NA NA NA icd151 151 1510 1512
5 1065 1113 NA NA icd153 NA NA NA
6 1309 NA NA NA icd155 NA NA NA
> dput(head(ccc3, 10))
structure(list(illness_1 = c(1065L, 1111L, 1439L, NA, 1065L,
1309L, NA, 1387L, 1065L, 1081L), illness_2 = c(1139L, 1400L,
NA, NA, 1113L, NA, NA, 99999L, 1077L, 1473L), illness_3 = c(244L,
1309L, NA, NA, NA, NA, NA, NA, NA, 1065L), illness_4 = c(3120L,
NA, NA, NA, NA, NA, NA, NA, NA, 1465L), ICD9.Code = c("icd042",
"icd135", "icd149", "icd151", "icd153", "icd155", "icd162", "icd172",
"icd173", "icd174"), DC = c(1439L, 1359L, 149L, 151L, NA, NA,
162L, 172L, 173L, NA), DC1 = c(NA, 135L, 1490L, 1510L, NA, NA,
NA, 1720L, 1730L, NA), DC2 = c(NA, 1073L, 1491L, 1512L, NA, NA,
NA, 1721L, 1731L, NA)), row.names = c(NA, 10L), class = "data.frame")
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)
I want to solve a statistical problem with R. I already have a working approach, but it takes too much time to get it through. Maybe someone of you has an idea how to program smarter, possibly without loops.
There is a field "Orders". Orders[, 1] contain the order number and Orders[, 2: 200] contain the article numbers ordered in the order.
I would like to fill in the field "Result". In Result[, 1] are all article numbers. The field to be filled is Result[, 2: 1000] with article numbers, which were purchased together with Result[, 1].
Since both (the i- and j-loop) goes up to more than 100000, the whole course takes ... Projected about 60 days. Does anyone have an idea to improve the performance?
My working code is:
for (i in 1:length(Result$Artiklenumber)) {
for (j in 1:length(Orders$Ordernumber)) {
if (length(which(Orders[j,]==Result[i,1])) == 0){
next
}
for (k in 2:(min(which(is.na(Orders[j,])))-1) ) {
if ( Orders[j,k]!=Result[i,1] ){
Result[i,min(which(is.na(Result[i,])))] <- Orders[j,k]
}
}
}
}
Example for "Orders":
0011566702 10131925 10131927 10136287 10136292 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011677781 16320 16800 16810 18270 18280 807310 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011724272 204520 204590 1083740 1083880 1111150 1111640 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011760684 10149459 10149460 10149461 10149462 10149463 10149464 10149465 10149466 10149467 10149468 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011784677 10151542 10151543 10151545 10151549 10151551 10151552 10151555 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011804598 10107450 10123183 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011811507 31540 4028890 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011813716 6670 16800 10050265 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
0011818851 16800 16810 807310 4229030 10050265 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Example for "Result":
16610 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16620 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16630 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16670 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16710 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16720 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16740 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16800 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16810 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
16820 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Here a solution which works without loops. First I generate some small test data:
orders = cbind(1001:1008, matrix(sample(1:6, 8*3, replace=TRUE), 8, 3))
orders[1:2, 4] = orders[4, 3:4] = NA
> orders
[,1] [,2] [,3] [,4]
[1,] 1001 2 4 NA
[2,] 1002 2 3 NA
...
then I extract the unique articles:
articles = unique(as.vector(orders[, -1]))
Finally I create a function which finds articles together in some basket and apply it:
findBaskets = function(article) {
ordersIncludingArticle = apply(orders[, -1] == article, 1, any)
articlesTogether = unique(as.vector(orders[ordersIncludingArticle, -1]))
articlesTogether[articlesTogether != article & !is.na(articlesTogether)]
}
sapply(articles, findBaskets)
However, this gives the solution in list format:
> res = sapply(articles, findBaskets)
> names(res) = articles
> res
$`2`
[1] 4 6 3 5 1
$`6`
[1] 3 2 1 5
...
To put this into an array you can create an empty matrix with the right dimensions and then fill the matrix by a loop or so. This should for sure not hurt the performance.
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.