根据唯一列值动态创建多个子集(Dynamically create multiple subsets based on unique column values)
我有一个时间戳列的数据,如下所示
v1 v2 v3 v4 v5 1 apple 2/20/2015 12:09:19 AM 100 98 2 pear 2/19/2015 12:09:16 AM 98 97 3 apple 2/19/2015 12:09:17 AM NA 80 4 apple 2/17/2015 12:09:11 AM 78 75 5 pear 2/20/2015 12:09:12 AM 50 62 6 cherry 2/21/2015 12:09:13 AM 75 75 7 apple 2/20/2015 12:09:14 AM 75 75
我想确定每天是否每种水果类型都有一个条目。 文件大小和水果种类数量都很大。
首先,对于每种水果类型,我都希望动态返回子集,例如苹果
v1 v2 v3 v4 v5 1 apple 2/20/2015 12:09:15 AM 100 98 3 apple 2/19/2015 12:09:15 AM NA 80 4 apple 2/17/2015 12:09:15 AM 78 75 7 apple 2/20/2015 12:09:14 AM 75 75
然后,对于每种水果类型,我期望计算是否有任何条目在一天内发生(例如,是或否,或者如下的0或1),例如对于苹果
v2 v3 sign apple 2/17/2015 1 apple 2/18/2015 0 apple 2/19/2015 1 apple 2/20/2015 1 apple 2/20/2015 1
我对r很陌生,任何指导都很有帮助。 我目前正在使用独特的(df $ v2),但在哈希卡或指定命名。
I have data with a timestamp column as shown here
v1 v2 v3 v4 v5 1 apple 2/20/2015 12:09:19 AM 100 98 2 pear 2/19/2015 12:09:16 AM 98 97 3 apple 2/19/2015 12:09:17 AM NA 80 4 apple 2/17/2015 12:09:11 AM 78 75 5 pear 2/20/2015 12:09:12 AM 50 62 6 cherry 2/21/2015 12:09:13 AM 75 75 7 apple 2/20/2015 12:09:14 AM 75 75
I want to determine if an entry occurred for each fruit type in each day. Both file-size and number of fruit types are large.
First for each fruit type I will want to dynamically return the subset e.g. for apple
v1 v2 v3 v4 v5 1 apple 2/20/2015 12:09:15 AM 100 98 3 apple 2/19/2015 12:09:15 AM NA 80 4 apple 2/17/2015 12:09:15 AM 78 75 7 apple 2/20/2015 12:09:14 AM 75 75
Then for each fruit type, I am looking to count if any entry occurred in a day (e.g. yes or no or 0 or 1 as below) e.g. for apple
v2 v3 sign apple 2/17/2015 1 apple 2/18/2015 0 apple 2/19/2015 1 apple 2/20/2015 1 apple 2/20/2015 1
I am new to r and any guidance is helpful. I am currently using unique(df$v2) but getting stuck on hash or assign naming.
最满意答案
要返回子集
ap <- subset(df, v2 == "apple")
然后,我认为,下面的内容将为您提供您想要的苹果。 首先,重新编码
v3
成为日期。d$v3 <- as.Date(d$v3, format = "%m/%d/%y")
然后在您想要的范围内创建一个日期序列作为数据框,然后合并它,并将所有日期的符号初始设置为0。
dates <- data.frame(v3 = seq.Date( from = as.Date("2/17/15", format = "%m/%d/%y"), to = as.Date("2/21/15", format = "%m/%d/%y"), by = "days"), sign = 0) ap <- merge(ap, dates, all = TRUE, by = "v3")
最后,当存在有效数据时,重新编码为1
ap$sign <- ifelse(!is.na(ap$v4)|!is.na(ap$v5), 1, ap$sign) ap v3 v2 v4 v5 sign 1 2015-02-17 apple 78 75 1 2 2015-02-18 <NA> NA NA 0 3 2015-02-19 apple NA 80 1 4 2015-02-20 apple 100 98 1 5 2015-02-20 apple 75 75 1 6 2015-02-21 <NA> NA NA 0
您可以通过首先分割数据框架,然后基本循环遍历列表来完成所有步骤。
splt <- split(d, d$v2) splt <- lapply(seq_along(splt), function(i) merge(splt[[i]], dates, by = "v3", all = TRUE)) lapply(splt, function(x) { x$sign <- ifelse(!is.na(x$v4)|!is.na(x$v5), 1, x$sign) x }) [[1]] v3 v2 v4 v5 sign 1 2015-02-17 apple 78 75 1 2 2015-02-18 <NA> NA NA 0 3 2015-02-19 apple NA 80 1 4 2015-02-20 apple 100 98 1 5 2015-02-20 apple 75 75 1 6 2015-02-21 <NA> NA NA 0 [[2]] v3 v2 v4 v5 sign 1 2015-02-17 <NA> NA NA 0 2 2015-02-18 <NA> NA NA 0 3 2015-02-19 <NA> NA NA 0 4 2015-02-20 <NA> NA NA 0 5 2015-02-21 cherry 75 75 1 [[3]] v3 v2 v4 v5 sign 1 2015-02-17 <NA> NA NA 0 2 2015-02-18 <NA> NA NA 0 3 2015-02-19 pear 98 97 1 4 2015-02-20 pear 50 62 1 5 2015-02-21 <NA> NA NA 0
编辑
我也应该提到,如果你想要的是水果每天的参赛次数,那么更简单的方法是使用
dplyr
,如下所示:d %>% group_by(v2, v3) %>% summarize(n = n()) v2 v3 n <chr> <date> <int> 1 apple 2015-02-17 1 2 apple 2015-02-19 1 3 apple 2015-02-20 2 4 cherry 2015-02-21 1 5 pear 2015-02-19 1 6 pear 2015-02-20 1
但是,这看起来不像你想要的那样,这就是为什么我采取了我所采取的方法。
I ended up using xtabs as below.
xtabs(~v3+v2,data=df)
This provided the count per v2 item, I then substituted values greater than 0 to 1.
相关问答
更多-
你应该可以使用s.th. 喜欢这个: awk '{ line_date = $1 / 100; print > "out_" line_date ".txt"; }' 顺便说一句,您可能希望避免“无用地使用猫”,而不是直接在您的文件上使用awk。 You should be able to use s.th. like this: awk '{ line_date = $1 / 100; print > "out_" line_date ".txt"; }' BTW you might want to ...
-
基于较大Data.Frame的多个子集创建多个列表(Creating Multiple Lists Based on Multiple Subsets of a Larger Data.Frame)[2021-11-28]
喜欢这个: library(reshape2) dcast(DF, ID_1 ~ Direction, value.var = "ID_2", list) # ID_1 0 1 # 1 100001 1111, 11111, 111111 1, 11, 111 # 2 100002 222, 2222 2, 22 # 3 100003 3333, 333 ... -
根据pandas dataframe中的列值在循环中创建子集(Create subsets in a loop according to a column values in pandas dataframe)[2022-07-24]
不需要提供索引和值的enumerate ,只需直接遍历c1列: for level in df.c1.unique(): df_s = df.loc[df.c1 == level].drop('c1', 1) print(level + ":\n", df_s) #A: # c2 c3 #0 1 2 #1 2 2 #B: # c2 c3 #2 0 2 #3 1 1 最有可能的是,你需要的是df.groupby('c1').apply(lam ... -
我们可以使用table !!table(1:nrow(df1), df1$Column1) # A B C # 1 TRUE FALSE FALSE # 2 FALSE TRUE FALSE # 3 FALSE FALSE TRUE 或者使用mtabulate的qdapTools library(qdapTools) mtabulate(df1$Column1)!=0 # A B C #[1,] TRUE FALSE FALSE # ...
-
为了实现从profile到dates的所需数据传输,您必须转换profile数据,然后将其与dates一起加入。 对于以下步骤,我使用了data.table包。 1)加载data.table包并将数据集转换为data.tables(增强型数据帧): library(data.table) setDT(profile) setDT(dates) 2)重新格式化profile数据集中的值: # set the 'off' values to NA profile[profile=="off"] <- NA ...
-
您可以使用pd.Series.value_counts : df['count'] = df['id'].map(df['id'].value_counts()) 结果: index id name dob visit count 0 0 111 Joe 1/1/2000 1/1/2018 3 1 1 111 Joe 1/1/2000 1/5/2018 3 2 2 122 Bob 1 ...
-
选项1 设置索引然后pipe df.set_index(['Timestamp', 'id']).pipe( lambda d: pd.Series(d.values.tolist(), d.index).unstack() ) id a b Timestamp 66 ...
-
您可以使用: #sample dataframe start = pd.to_datetime('2016-12-28') rng = pd.date_range(start, periods=100, freq='100min') df = pd.DataFrame({'timestamp': rng, 'X': range(100), 'id': ['a'] * 30 + ['b'] * 30 + ['c'] * 40 }) df = df.set_index ...
-
流畅的NHibernate:允许多个NULL值的唯一列(Fluent NHibernate: unique column that allows multiple NULL values)[2022-11-01]
你不能在NHibernate中这样做,也就是说,NHibernate不会让你创造这种约束。 是的,例如,如果您创建一个不适用于NULLS的唯一索引,则可以在SQL Server中使用: CREATE UNIQUE INDEX idx_UniqueProperty_notnull ON dbo.T1(UniqueProperty) WHERE UniquePropertyIS NOT NULL; You cannot do that in NHibernate, that is, NHibernate wo ... -
要返回子集 ap <- subset(df, v2 == "apple") 然后,我认为,下面的内容将为您提供您想要的苹果。 首先,重新编码v3成为日期。 d$v3 <- as.Date(d$v3, format = "%m/%d/%y") 然后在您想要的范围内创建一个日期序列作为数据框,然后合并它,并将所有日期的符号初始设置为0。 dates <- data.frame(v3 = seq.Date( from = as.Date("2/17/15", form ...