我有以下数据框use v5.12;
use Path::Tiny "path"; # Used for slurp
my $data_string = path("mit.txt")->slurp_utf8; # random filename for data
my $data = eval $data_string ;
warn $@ if $@;
say "Servies:\n ", join(", ", @{ $data->{ data }->{services} });
say "Destinations:\n ", join(", ", @{ $data->{ data }->{destinations} });
say "Sources:\n ", join(", ", @{ $data->{ data }->{sources} });
exit 0;
#
# Outputs:
#
Servies:
REF_SerTcpTcp5090, REF_SerTcpTcp8200, REF_SerTcpTcp8883, REF_SerTcpTcpudp5090
Destinations:
REF_NetworkAny
Sources:
REF_MHTGIvpkvI
,由table5
及其频率组成,使用x
从其他数据生成:
counts
我希望以一般方式(即与原始数据框中的其他值一起使用)转移到以下数据框 x freq
1 1 3
2 3 21
3 4 21
4 5 1345
5 7 1
:
table5if
即。其中数字3,4和5的频率直接传输,所有其他数字在 Frequency
3 21
4 21
5 1345
other 4
中加在一起。我最近的尝试是这样的:
other
此尝试以及使用k <- seq(1, nrow(table5), by=1)
ifelse(table5$x[k] == 3, table5if[1] <- table5$freq[k],
ifelse(table5$x[k] == 4, table5if[2] <- table5$freq[k],
ifelse(table5$x[k] == 5, table5if[3] <- table5$freq[k], table5if[4] <- (table5if[4] + table5$freq[k])
)
)
)
的其他尝试都产生了某种形式的警告或错误(例如&#34;要替换的项目数量......&#34;和&#34;数量尺寸...&#34;并且没有产生任何令人信服的结果。我已经查看了无数其他问题的错误/警告,并且无法找到我正在寻找的东西 - 那里有很多关于矢量化的内容,但是我无法理解为什么会出现这个问题。任何人都可以为这项小任务提出合适的选择吗?
答案 0 :(得分:3)
我将按factor(x, levels = 3:5)
进行汇总,而所有非现有级别将变为NA
。然后,如果您愿意,可以将其更改为"other"
。在这种情况下data.table
很方便,因为它会使NA
成为一个单独的组而不是省略它们
library(data.table)
setDT(df)[, .(Frequency = sum(freq)), by = factor(x, levels = 3:5)]
# factor Frequency
# 1: NA 4
# 2: 3 21
# 3: 4 21
# 4: 5 1345
答案 1 :(得分:0)
base R
选项是根据&#39; x&#39;的值创建逻辑索引。 %in%
列。我们得到了sum
&#39; freq&#39;基于&#39; i1&#39;的否定索引和rbind
以及&#39; table5&#39;。
i1 <- table5$x %in% 3:5
`row.names<-`(rbind(table5[i1,], list(x= "Other",
freq=sum(table5[!i1,"freq"]))), NULL)
# x freq
#1 3 21
#2 4 21
#3 5 1345
#4 Other 4