我有这样的每月数据,我的第一列是date
,下一个列是me
:
我需要做简单的事情:
我需要创建另一个变量,以使整个1994年的价值为me
在1993年12月的价值。同样,1995年的价值为1994年12月,依此类推。如果不可用,请给NA。
structure(list(date = structure(c(8673, 8702, 8734, 8765, 8796,
8824, 8855, 8884, 8916, 8946, 8975, 9008, 9038, 9069, 9099, 9129,
9161, 9189, 9220, 9248, 9281, 9311, 9342, 9373, 9402, 9434, 9464,
9493, 9526, 9555, 9584, 9616, 9647, 9675, 9708, 9738, 9769, 9800,
9829, 9861, 9892, 9920, 9951, 9981, 10011, 10042, 10073, 10102,
10134, 10165, 10193, 10226, 10256, 10284, 10316, 10346, 10375,
10407, 10438, 10469, 10499, 10529, 10560, 10591, 10620, 10648,
10681, 10711, 10739, 10772, 10802, 10834, 10864, 10893, 10925,
10956, 10987, 11016, 11047, 11075, 11108, 11138, 11169, 11200,
11229, 11261, 11291, 11320), class = "Date"), me = c(41535, 39458.25,
38766, 43611.75, 54687.75, 65763.75, 66456, 92069.25, 89300.25,
82452.125, 81066.375, 76909.125, 70698.75, 79709.375, 77630,
71391.875, 69312.5, 69312.5, 70542.8125, 52621.125, 46520.125,
43469.625, 45757.5, 43850.9375, 40492, 32088, 38964, 35149.75,
32857.375, 35149.75, 29074.75, 26779.375, 27544.5, 32140.5, 32905.75,
32905.75, 34436.25, 31375.25, 32140.5, 29878.875, 39838.5, 42519.9375,
42707.25, 40014, 43861.5, 51615.125, 46992.875, 46992.875, 53996.25,
47053.875, 47053.875, 46706, 50180, 56356, 65641.25, 69116.375,
65255.125, 60469.5, 62020, 41863.5, 48919.5, 55908, 57461, 57970.3125,
59137.5, 53301.5625, 68475, 72365.625, 65751.5625, 71587.5, 85982.8125,
73921.875, 84496.5, 82149.375, 79019.875, 89973.125, 99752.8125,
106794.1875, 103425.5625, 123669, 143544.375, 143325, 139668.75,
143325, 139536, 122820.75, 125001, 101933.0625)), .Names = c("date",
"me"), class = "data.frame", row.names = c(81L, 80L, 79L, 82L,
87L, 91L, 92L, 88L, 83L, 90L, 94L, 86L, 84L, 93L, 89L, 85L, 102L,
101L, 95L, 105L, 96L, 106L, 99L, 100L, 104L, 98L, 97L, 103L,
108L, 107L, 112L, 111L, 109L, 110L, 114L, 117L, 115L, 116L, 118L,
113L, 123L, 125L, 130L, 128L, 119L, 122L, 127L, 120L, 126L, 129L,
121L, 124L, 140L, 136L, 139L, 137L, 134L, 132L, 131L, 141L, 133L,
135L, 138L, 142L, 146L, 153L, 154L, 150L, 148L, 144L, 149L, 152L,
143L, 145L, 151L, 147L, 165L, 157L, 156L, 163L, 164L, 160L, 161L,
158L, 155L, 166L, 162L, 159L))
答案 0 :(得分:1)
library(lubridate)
new$date <- ymd(new$date)
new$flag <- ifelse(month(new$date) == month(12),1,"NA")
这是使用Base R ad lubridate的简单解决方案
答案 1 :(得分:1)
这是一个可能的解决方案:
library(zoo)
library(lubridate)
我们首先创建一些简单有用的变量:
d <- d %>%
mutate(date = ymd(date),
month = month(date),
year = year(date)) %>%
groupby(year) %>% # for each year we fill just the december value in new_var
mutate(new_var = ifelse(month==12, me, NA)) %>% ungroup()
现在,我们可以使用new_var
中的na.locf
来填充zoo
。向前移动每个NA
时,将填充最后一个非空值(十二月的值)。
d <- d %>%
mutate(new_var = na.locf(new_var, na.rm=F))
head(d, 10)
# # A tibble: 10 x 5
# date me month year new_var
# <date> <dbl> <dbl> <dbl> <dbl>
# 1 1993-09-30 41535 9 1993 NA
# 2 1993-10-29 39458. 10 1993 NA
# 3 1993-11-30 38766 11 1993 NA
# 4 1993-12-31 43612. 12 1993 43612.
# 5 1994-01-31 54688. 1 1994 43612.
# 6 1994-02-28 65764. 2 1994 43612.
# 7 1994-03-31 66456 3 1994 43612.
# 8 1994-04-29 92069. 4 1994 43612.
# 9 1994-05-31 89300. 5 1994 43612.
# 10 1994-06-30 82452. 6 1994 43612.
由于没有前一年,您只需要定义填充NA
的方式即可。
答案 2 :(得分:1)
这是另一种仅使用dplyr
作为数据的df
的解决方案。
您创建2个data.frames:
然后合并两个data.frames(我使用(data.table::) merge,但是您可以使用dplyr :: left_join,都很好)
,然后删除年月。
df %>%
{merge(x = transmute(., date, me, year = as.numeric(substr(date, 1, 4)), month = '12'),
y = transmute(., new_var = me, year = as.numeric(substr(date, 1, 4)) + 1, month = substr(date, 6, 7)),
by = c('year', 'month'),
all.x = TRUE)} %>%
select(-year, -month)
答案 3 :(得分:1)
上一个12月的me
值是向后m
行返回的值,其中m
的1月为1,2月为2,依此类推,否则如果没有行{{1 }}后面的行是NA。计算m
和顺序行号m
,我们得到以下内容。不使用任何软件包。
ix
给予:
m <- as.numeric(format(DF$date, "%m"))
ix <- seq_len(nrow(DF))
transform(DF, me_dec = me[ifelse(ix - m < 1, NA, ix - m)])
答案 4 :(得分:0)
@neeraj,如果您使用多年,则RLave提供的解决方案将不起作用,因为12月的值将不正确。该值保持不变,但应为一年前的12月值,并且由于它是NA,因此以这种方式填充。
如果创建的变量等于new_var的前导,则可以使用他的解决方案。
public class DialogCompanyAddress extends DialogFragment {
public DialogCompanyAddress() {
// Required empty public constructor
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.fragment_dialog_company_address,null));
builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//save data to the firebase
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Do
}
});
return builder.create();
}
}
应纠正该答案。