Функция which() в R
Я пишу цикл для этого
n<-nrow(Example) #Example has two only variables but the for loop attempts to expand and work also for approx 500.
Newdata<-matrix()
loops<-ncol(Example)-1 #number of loops
for(i in 1:loops){
#Example[,1] is the the guide column and thus this doesn't change in the loop
nhat<-which(Example[1,i+1]==Example[,1]) #finds the position of the first date in column 2 according to the first column
nend<-which(Example[n,1]==Example[,2]) #finds the position of last date in col 2 according to the first column
Newdata[,i]<-c(rep(NA,nhat-1),Example[1:nend,i+1],NA) #creates the new data
}
Однако, когда я запускаю его, я получаю эту ошибку:
Error in Ops.data.frame(Example[1, 2], Example[, 1]) :
‘==’ only defined for equally-sized data frames
Если я использую это:which(Example$V2[1]==Example$V1)
программа работает гладко, за исключением того, что я не могу повторить ее для каждого столбца, если я использую $
, Любые предложения о том, как решить проблему?
Пример данных или
dput
вывод (мини-версия, потому что полная версия здесь не подходит):
dput(Example[1:100,c(1:3)])
structure(list(`1` = structure(c(820540800, 820627200, 820713600,
820800000, 821059200, 821145600, 821232000, 821318400, 821404800,
821664000, 821750400, 821836800, 821923200, 822009600, 822268800,
822355200, 822441600, 822528000, 822614400, 822873600, 822960000,
823046400, 823132800, 823219200, 823478400, 823564800, 823651200,
823737600, 823824000, 824083200, 824169600, 824256000, 824342400,
824428800, 824774400, 824860800, 824947200, 825033600, 825292800,
825379200, 825465600, 825552000, 825638400, 825897600, 825984000,
826070400, 826156800, 826243200, 826502400, 826588800, 826675200,
826761600, 826848000, 827107200, 827193600, 827280000, 827366400,
827452800, 827712000, 827798400, 827884800, 827971200, 828057600,
828316800, 828403200, 828489600, 828576000, 828921600, 829008000,
829094400, 829180800, 829267200, 829526400, 829612800, 829699200,
829785600, 829872000, 830131200, 830217600, 830304000, 830390400,
830476800, 830736000, 830822400, 830908800, 830995200, 831081600,
831340800, 831427200, 831513600, 831600000, 831686400, 831945600,
832032000, 832118400, 832204800, 832291200, 832550400, 832636800,
832723200), class = c("POSIXct", "POSIXt"), tzone = "UTC"), `2` = structure(c(995587200,
995846400, 995932800, 996019200, 996105600, 996192000, 996451200,
996537600, 996624000, 996710400, 996796800, 997056000, 997142400,
997228800, 997315200, 997401600, 997660800, 997747200, 997833600,
997920000, 998006400, 998265600, 998352000, 998438400, 998524800,
998611200, 998870400, 998956800, 999043200, 999129600, 999216000,
999561600, 999648000, 999734400, 999820800, 1000080000, 1000684800,
1000771200, 1000857600, 1000944000, 1001030400, 1001289600, 1001376000,
1001462400, 1001548800, 1001635200, 1001894400, 1001980800, 1002067200,
1002153600, 1002240000, 1002499200, 1002585600, 1002672000, 1002758400,
1002844800, 1003104000, 1003190400, 1003276800, 1003363200, 1003449600,
1003708800, 1003795200, 1003881600, 1003968000, 1004054400, 1004313600,
1004400000, 1004486400, 1004572800, 1004659200, 1004918400, 1005004800,
1005091200, 1005177600, 1005264000, 1005523200, 1005609600, 1005696000,
1005782400, 1005868800, 1006128000, 1006214400, 1006300800, 1006473600,
1006732800, 1006819200, 1006905600, 1006992000, 1007078400, 1007337600,
1007424000, 1007510400, 1007596800, 1007683200, 1007942400, 1008028800,
1008115200, 1008201600, 1008288000), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), `3` = structure(c(820540800, 820627200, 820713600,
820800000, 821059200, 821145600, 821232000, 821318400, 821404800,
821664000, 821750400, 821836800, 821923200, 822009600, 822268800,
822355200, 822441600, 822528000, 822614400, 822873600, 822960000,
823046400, 823132800, 823219200, 823478400, 823564800, 823651200,
823737600, 823824000, 824083200, 824169600, 824256000, 824342400,
824428800, 824774400, 824860800, 824947200, 825033600, 825292800,
825379200, 825465600, 825552000, 825638400, 825897600, 825984000,
826070400, 826156800, 826243200, 826502400, 826588800, 826675200,
826761600, 826848000, 827107200, 827193600, 827280000, 827366400,
827452800, 827712000, 827798400, 827884800, 827971200, 828057600,
828316800, 828403200, 828489600, 828576000, 828921600, 829008000,
829094400, 829180800, 829267200, 829526400, 829612800, 829699200,
829785600, 829872000, 830131200, 830217600, 830304000, 830390400,
830476800, 830736000, 830822400, 830908800, 830995200, 831081600,
831340800, 831427200, 831513600, 831600000, 831686400, 831945600,
832032000, 832118400, 832204800, 832291200, 832550400, 832636800,
832723200), class = c("POSIXct", "POSIXt"), tzone = "UTC")), .Names = c("1",
"2", "3"), row.names = c(NA, -100L), class = c("tbl_df", "tbl",
"data.frame"))
Таким образом, вывод, если код работает, выглядит следующим образом:
DatesV1 DatesV2
... ...
17/07/2001 NA
18/07/2001 NA
19/07/2001 19/07/2001
20/07/2001 20/07/2001
21/07/2001 NA
... ...
1 ответ
Ваши данные хранятся в виде таблицы, а не в качестве базового кадра данных. База данных имеет drop=TRUE
по умолчанию, так что df[,1]
возвращает вектор (не датафрейм). Тиблс есть drop=FALSE
как их по умолчанию, так df[,1]
все еще Tibble / Dataframe. В этом случае не имеет смысла проверять два кадра данных разного измерения на равенство, используя ==
потому что датафреймы не перерабатываются как векторы. У вас есть два варианта,
Вариант 1: очистить таблицу, сбросив класс вашего фрейма данных
class(Example) <- "data.frame"
Вариант 2: добавить drop=TRUE
каждый раз, когда вы вводите квадратные скобки, как в:
Example[n,1,drop=TRUE]