根据特定列用其他值填充数据框列

时间:2018-07-03 09:04:09

标签: r dataframe

我的dataframe如下:

enter image description here

我尝试添加新列,并为每行填充列号的值(间隔+ 3)。

例如,如果intervals = 3,我想获取DF[,3+3]的值

我尝试了这个,但是没用:

DF$new_col <- DF[,DF$intervals[]+3]

2 个答案:

答案 0 :(得分:0)

尽管从问题中不能完全清楚地描述问题。如果解决了您的查询,仍请检查以下基于for的基于循环的解决方案。请注意,由于未提供可复制的数据,因此我为此目的生成了一个虚拟数据。

> df<-data.frame(D1=c(2,8,1,5,2),D2=c(7,3,5,6,8),D3=c(9,6,4,1,0),D4=c(12,20,61,80,91),Interval=c(1,2,1,0,1))
> df
  D1 D2 D3 D4 Interval
1  2  7  9 12        1
2  8  3  6 20        2
3  1  5  4 61        1
4  5  6  1 80        0
5  2  8  0 91        1
> for (i in 1:nrow(df)){
+ df[i,6]<-df[i,df$Interval[i]+3]
+ }
> df
  D1 D2 D3 D4 Interval V6
1  2  7  9 12        1 12
2  8  3  6 20        2  2
3  1  5  4 61        1 61
4  5  6  1 80        0  1
5  2  8  0 91        1 91

答案 1 :(得分:0)

我不确定速度有多快,但这是使用from multiprocessing import Queue, Value, Process import queue def creator(urls, closing_condition): """Parse page and put urls in given Queue.""" while (not closing_condition): created_urls = create_url_method() [urls.put(url) for url in created_urls] def consumer(urls, closing_condition): """Consume urls in given Queue.""" while (not closing_condition): try: store_url(urls.get(timeout=1)) except queue.Empty: pass urls = Queue() semaphore = Value('d', 0) creators_number = 2 consumers_number = 2 creators = [ Process(target=creator, args=(urls, semaphore)) for i in range(creators_number) ] consumers = [ Process(target=consumer, args=(urls, semaphore)) for i in range(consumers_number) ] [p.start() for p in creators + consumer] [p.join() for p in creators + consumer] split的解决方案。

一些示例数据:

mapply

我们首先按set.seed(1) df <- data.frame(var1 = 1:10, var2 = 11:20, var3 = 21:30, intervals = sample(0:2, 10, replace = T)) var1 var2 var3 intervals 1 1 11 21 0 2 2 12 22 1 3 3 13 23 1 4 4 14 24 2 5 5 15 25 0 6 6 16 26 2 7 7 17 27 2 8 8 18 28 1 9 9 19 29 1 10 10 20 30 0 对数据框进行排序:

intervals

现在,我们将df <- df[order(df$intervals),] var1 var2 var3 intervals 1 1 11 21 0 5 5 15 25 0 10 10 20 30 0 2 2 12 22 1 3 3 13 23 1 8 8 18 28 1 9 9 19 29 1 4 4 14 24 2 6 6 16 26 2 7 7 17 27 2 的每个值split划分为子集。

intervals

现在,我们使用df1 <- split(df, df$intervals) 同时遍历子集列表和向量mapply(对于您来说,它为+3)以选择正确的值。

unique(df$intervals)+1

最后,使用newvalues <- mapply(function(x, y){ x[, y] }, df1, unique(df$intervals)+1) 将值反馈回原始的,已排序的数据帧。

unlist

结果:

df$new <- unlist(newvalues)