Возможный подход:
Input[, c("count.lag","stdev","mean") :=
transpose(lapply(1L:.N, function(n) {
x <- Response[(n+1L):min(n+5L, .N)]
c(sum(!is.na(x)), sd(x), mean(x))
}))]
вывод:
Response count.lag stdev mean
1: NA 4 NA NA
2: 1 4 NA NA
3: 2 4 NA NA
4: 3 4 NA NA
5: NA 5 1.3038405 2.2
6: 1 5 1.5811388 3.0
7: 1 5 1.5811388 4.0
8: 2 5 1.5811388 5.0
9: 3 5 1.5811388 6.0
10: 4 5 1.5811388 7.0
11: 5 5 1.5811388 8.0
12: 6 4 1.2909944 8.5
13: 7 3 1.0000000 9.0
14: 8 2 0.7071068 9.5
15: 9 1 NA 10.0
16: 10 1 NA NA
данные:
Input <- fread("Response
NA
1
2
3
NA
1
1
2
3
4
5
6
7
8
9
10")
<час> правка: или согласно предложению Майкла Чирико, используя [ 115]. Конечные значения различны и зависят от того, как OP хочет обрабатывать конечные значения.
#requires data.table version >= 1.12.0 to use negative shifts (else use type='lag' with positive integers
Input[, c("count.lag", "stdev", "mean") :=
.SD[, shift(Response, -1L:-5L)][,
.(apply(.SD, 1L, function(x) sum(!is.na(x))),
apply(.SD, 1L, sd),
apply(.SD, 1L, mean))]
]
выход:
Response count.lag stdev mean
1: NA 4 NA NA
2: 1 4 NA NA
3: 2 4 NA NA
4: 3 4 NA NA
5: NA 5 1.303840 2.2
6: 1 5 1.581139 3.0
7: 1 5 1.581139 4.0
8: 2 5 1.581139 5.0
9: 3 5 1.581139 6.0
10: 4 5 1.581139 7.0
11: 5 5 1.581139 8.0
12: 6 4 NA NA
13: 7 3 NA NA
14: 8 2 NA NA
15: 9 1 NA NA
16: 10 0 NA NA
Я сделал это с IValueConverter следующим образом:
Созданный класс FontSizeConverter, который происходит из IValueConverter. Метод Преобразования добавляет 10 к значению, и метод ConvertBack вычитает 10.
public class FontSizeConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)value + 12.0;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)value - 12.0;
}
#endregion
}
Затем, я declaried экземпляр этого класса в шаблоне XAML для управления:
<Style.Resources>
<local:FontSizeConverter x:Key="fontSizeConverter"/>
</Style.Resources>
И Finnaly, FontSize, связывающий, использует этот преобразователь, относился к наследованному свойству FontSize:
<TextBlock FontSize="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontSize, Converter={StaticResource fontSizeConverter}}"
Grid.Row="0" Text="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Date.Day}" HorizontalAlignment="Right" VerticalAlignment="Top" Padding="2" Margin="2" >
</TextBlock>
Это работает. Но я все еще не знаю, является ли это корректным ответом. Сообщите мне, существует ли лучший путь, или если это является соответствующим.
Более общий способ
Преобразователь значений
public class MathConverter : IValueConverter
{
public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
{
return (double)value + double.Parse( parameter.ToString() );
}
public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
{
return null;
}
}
Ресурс конвертера
<my:MathConverter x:Key="MathConverter" />
XAML
<TextBlock FontSize="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Window}},
Path=FontSize,
Converter={StaticResource MathConverter},
ConverterParameter=2}" />