使用data.frame中的一列选择另一列
如何使用data.frame中的一个变量引用另一个变量 假设我有:使用data.frame中的一列选择另一列,r,dataframe,R,Dataframe,如何使用data.frame中的一个变量引用另一个变量 假设我有: col col1 col2 "col1" 1 5 "col2" 2 6 "col1" 3 7 "col2" 4 8 我想: col col1 col2 answer "col1" 1 5 1 "col2" 2 6 6 "col1"
col col1 col2
"col1" 1 5
"col2" 2 6
"col1" 3 7
"col2" 4 8
我想:
col col1 col2 answer
"col1" 1 5 1
"col2" 2 6 6
"col1" 3 7 3
"col2" 4 8 8
,
这看起来并不难,但我发现的解决方案不是很优雅,可能还有更好的方法。但您可以使用匹配,然后根据匹配使用子集:
dat <- read.table(text="col col1 col2
col1 1 5
col2 2 6
col1 3 7
col2 4 8", header = T, stringsAsFactors = FALSE)
cols <- unique(dat$col)
matches <- match(dat$col, cols)
dat$answer <- sapply(seq_along(matches), function (i) {
dat[i,cols[matches[i]]]
})
编辑
实际上,这里有一个更好的方法:
dat$answer <- sapply(1:nrow(dat), function(r) {
dat[r,dat$col[r]]
})
这显然是您尝试过的,但是使用sapply而不是unlislplappy,所以是的,不确定这是否有帮助。这看起来并不难,但我发现的解决方案不是很优雅,可能有更好的方法。但您可以使用匹配,然后根据匹配使用子集:
dat <- read.table(text="col col1 col2
col1 1 5
col2 2 6
col1 3 7
col2 4 8", header = T, stringsAsFactors = FALSE)
cols <- unique(dat$col)
matches <- match(dat$col, cols)
dat$answer <- sapply(seq_along(matches), function (i) {
dat[i,cols[matches[i]]]
})
编辑
实际上,这里有一个更好的方法:
dat$answer <- sapply(1:nrow(dat), function(r) {
dat[r,dat$col[r]]
})
这显然是您尝试过的,但是使用sapply而不是unlislplappy,所以是的,不确定这是否有帮助。我知道已经有答案了,但我认为另一种方法可能有用:
read.table(text='col col1 col2
"col1" 1 5
"col2" 2 6
"col1" 3 7
"col2" 4 8',h=T)->df
df$answer <- as.integer(df[ cbind(c(1:nrow(df)), match(df$col, names(df))) ])
df
# col col1 col2 answer
# 1 col1 1 5 1
# 2 col2 2 6 6
# 3 col1 3 7 3
# 4 col2 4 8 8
我知道已经有答案了,但我认为另一种方法可能有用:
read.table(text='col col1 col2
"col1" 1 5
"col2" 2 6
"col1" 3 7
"col2" 4 8',h=T)->df
df$answer <- as.integer(df[ cbind(c(1:nrow(df)), match(df$col, names(df))) ])
df
# col col1 col2 answer
# 1 col1 1 5 1
# 2 col2 2 6 6
# 3 col1 3 7 3
# 4 col2 4 8 8
在这种情况下,只有2列的ifelsemight是最快、最直接的解决方案
df$answer <- ifelse(df[,1] == "col1",df[,"col1"],df[,"col2”])
col col1 col2 answer
1 col1 1 5 1
2 col2 2 6 6
3 col1 3 7 3
4 col2 4 8 8
或者没有for循环:
df$ans <- sapply(1:nrow(df),function(i) switch(df[i,1],df[i,df[i,1]]))
例如:
df <- data.frame(col=sample(paste0('col',1:5),10,replace=T),col1=1:10,col2=11:20,col3=21:30,col4=31:40,col5=41:50,stringsAsFactors = F)
选择以下元素:
df$ans <- sapply(1:nrow(df),function(i) switch(df[i,1],df[i,df[i,1]]))
df
col col1 col2 col3 col4 col5 ans
1 col1 1 11 21 31 41 1
2 col1 2 12 22 32 42 2
3 col5 3 13 23 33 43 43
4 col2 4 14 24 34 44 14
5 col3 5 15 25 35 45 25
6 col4 6 16 26 36 46 36
7 col5 7 17 27 37 47 47
8 col3 8 18 28 38 48 28
9 col1 9 19 29 39 49 9
10 col5 10 20 30 40 50 50
在这种情况下,只有2列的ifelsemight是最快、最直接的解决方案
df$answer <- ifelse(df[,1] == "col1",df[,"col1"],df[,"col2”])
col col1 col2 answer
1 col1 1 5 1
2 col2 2 6 6
3 col1 3 7 3
4 col2 4 8 8
或者没有for循环:
df$ans <- sapply(1:nrow(df),function(i) switch(df[i,1],df[i,df[i,1]]))
例如:
df <- data.frame(col=sample(paste0('col',1:5),10,replace=T),col1=1:10,col2=11:20,col3=21:30,col4=31:40,col5=41:50,stringsAsFactors = F)
选择以下元素:
df$ans <- sapply(1:nrow(df),function(i) switch(df[i,1],df[i,df[i,1]]))
df
col col1 col2 col3 col4 col5 ans
1 col1 1 11 21 31 41 1
2 col1 2 12 22 32 42 2
3 col5 3 13 23 33 43 43
4 col2 4 14 24 34 44 14
5 col3 5 15 25 35 45 25
6 col4 6 16 26 36 46 36
7 col5 7 17 27 37 47 47
8 col3 8 18 28 38 48 28
9 col1 9 19 29 39 49 9
10 col5 10 20 30 40 50 50
答案是如何确定的?答案是由df$coldf$answer=unlistalapply1指定的列中的数字:dimdf[1],functionidx-df[idx,df[,df$col[idx]]似乎起作用,但可能还有更好的方法?答案是如何确定的?答案是由df$coldf$answer=unlistalapply1:dimdf[1],functionidx-df指定的列中的数字[idx,df[,df$col[idx]]似乎有效,但也许有更好的方法?@N8TRO,看看我的编辑,以获得更通用的解决方案。我喜欢它。Switch是一个非常强大的函数,是其他两个答案的一个很好的替代品。@N8TRO谢谢你的好意评论。你能用这些非常基本的函数做什么,真是太棒了。@N8TRO,看看我的编辑,了解更多信息ral解决方案。我喜欢它。Switch是一个非常强大的函数,是其他两个答案的一个很好的替代品。@N8TRO感谢您的好意评论。使用非常基本的函数所能做的事情令人惊讶。这就是惯用的R答案。这就是惯用的R答案。