根据特定列,用其他列的值填充dataframe列
我的根据特定列,用其他列的值填充dataframe列,r,dataframe,R,Dataframe,我的dataframe看起来像: 我尝试添加一个新列,并用每行的列号(间隔+3)值填充它 例如,如果interval=3,我想得到DF[,3+3] 我试过这个,但没用: DF$new_col <- DF[,DF$intervals[]+3] DF$new\u col尽管问题的描述并不完全清楚。如果基于循环的解决方案解决了您的查询,请仍然检查以下以获得基于循环的解决方案。请注意,由于没有提供可复制的数据,我为此生成了一个虚拟数据 > df<-data.frame(D1=c(2
dataframe
看起来像:
我尝试添加一个新列,并用每行的列号(间隔+3)值填充它
例如,如果interval=3
,我想得到DF[,3+3]
我试过这个,但没用:
DF$new_col <- DF[,DF$intervals[]+3]
DF$new\u col尽管问题的描述并不完全清楚。如果基于循环的解决方案解决了您的查询,请仍然检查以下以获得
基于循环的解决方案。请注意,由于没有提供可复制的数据,我为此生成了一个虚拟数据
> 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
>测向
D1 D2 D3 D4间隔
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
>适用于(i/1:nrow(df)){
+df[i,6]df
D1 D2 D3 D4间隔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
我不确定它有多快,但这里有一个使用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
现在,我们将数据拆分为间隔的每个值的子集
df1 <- split(df, df$intervals)
最后,通过使用unlist
将值反馈回原始的排序数据帧
df$new <- unlist(newvalues)
因此,对于interval==3
,您希望获得列solarNoon
?DF$new\u col=DF[1:nrow(DF),DF$interval+3]
的值,请以纯文本形式提供示例(例如使用dput
)而不是图片。对于SO社区和搜索引擎来说,这更容易回答问题efficient@Emmanuel-林:很抱歉,这是我在这里的第一篇帖子,但我会考虑你的评论time@LAP没错,新列将根据中的值获取以下列中的值:午夜、日出、日光、日落、夜晚、昨夜列“Interval”列。如果Interval==3,我想得到solarNoon列的值,如果Interval==2,我得到sunrise的值,等等。谢谢你的回答,这正是我想要的,但由于数据帧非常大,我想避免使用for循环。
newvalues <- mapply(function(x, y){
x[, y]
}, df1, unique(df$intervals)+1)
df$new <- unlist(newvalues)
var1 var2 var3 intervals new
1 1 11 21 0 1
5 5 15 25 0 5
10 10 20 30 0 10
2 2 12 22 1 12
3 3 13 23 1 13
8 8 18 28 1 18
9 9 19 29 1 19
4 4 14 24 2 24
6 6 16 26 2 26
7 7 17 27 2 27