Если вы ссылаетесь на рамки Cocoa или Foundation, вы можете использовать object-c в своем C-коде. Однако, если вы хотите использовать стандартный синтаксис обмена сообщениями, вам придется изменить расширение файла с .c на .m, чтобы оно было скомпилировано как объектное c. Если вы сохраните расширение .c, вы сможете использовать вызовы времени выполнения c-стиля для взаимодействия с объектами-объектами (например, objc_msgSend
, objc_getClass
и т. Д.).
Примеры: Внутри файла .m
void cFunction() {
[[NSString alloc] init];
}
Внутри файла .c
void cFunction() {
void* cls = objc_getClass("NSString");
void* obj = objc_msgSend(cls, NSSelectorFromString(CFSTR("alloc")));
obj = objc_msgSend(obj, NSSelectorFromString(CFSTR("init")));
}
Если вы выберете второй метод, обратитесь к Ссылка времени выполнения Objective-C .
Вы также можете сделать:
df %>%
group_by(ID) %>%
mutate(firstprice = Price[Index == min(Index)],
lastprice = Price[Index == max(Index)])
ID Price Index firstprice lastprice
<fct> <dbl> <dbl> <dbl> <dbl>
1 ABC 31. 3. 31. 81.
2 ABC 81. 6. 31. 81.
3 BCD 100. 2. 100. 84.
4 BCD 84. 9. 100. 84.
5 BCD 15. 5. 100. 84.
6 DEF 31. 12. 31. 42.
7 DEF 42. 18. 31. 42.
Или:
df %>%
group_by(ID) %>%
arrange(Index, .by_group = TRUE) %>%
mutate(firstprice = Price[Index == first(Index)],
lastprice = Price[Index == last(Index)])
ID Price Index firstprice lastprice
<fct> <dbl> <dbl> <dbl> <dbl>
1 ABC 31. 3. 31. 81.
2 ABC 81. 6. 31. 81.
3 BCD 100. 2. 100. 84.
4 BCD 15. 5. 100. 84.
5 BCD 84. 9. 100. 84.
6 DEF 31. 12. 31. 42.
7 DEF 42. 18. 31. 42.
Мы можем group_by
ID
и использовать which.min
и which.max
, чтобы получить индекс, а затем получить соответствующий Price
из него
library(dplyr)
df %>%
group_by(ID) %>%
mutate(firstPrice = Price[which.min(Index)],
lastPrice = Price[which.max(Index)])
# ID Price Index firstPrice lastPrice
# <fct> <dbl> <dbl> <dbl> <dbl>
#1 ABC 31 3 31 81
#2 ABC 81 6 31 81
#3 BCD 100 2 100 84
#4 BCD 84 9 100 84
#5 BCD 15 5 100 84
#6 DEF 31 12 31 42
#7 DEF 42 18 31 42
Опция с использованием data.table
library(data.table)
setDT(df)[, .(firstprice = Price[which.min(Index)],
lastprice = Price[which.max(Index)]), ID]
# ID firstprice lastprice
#1: ABC 31 81
#2: BCD 100 84
#3: DEF 31 42
Или другой вариант с tidyverse
library(tidyverse)
df %>%
group_by(ID) %>%
filter(Index %in% range(Index)) %>%
mutate(newCol = c("firstprice", "lastprice")) %>%
select(-Index) %>%
spread(newCol, Price)
# A tibble: 3 x 3
# Groups: ID [3]
# ID firstprice lastprice
# <fct> <dbl> <dbl>
#1 ABC 31 81
#2 BCD 100 84
#3 DEF 31 42