具有来自另一个的值的新列,其名称在R中的第三个中

时间:2014-07-14 20:23:02

标签: r

得到了我无法解决的问题。 示例数据集:

company <- c("compA","compB","compC")
compA <- c(1,2,3)
compB <- c(2,3,1)
compC <- c(3,1,2)
df <- data.frame(company,compA,compB,compC)

我想创建一个新列,其中包含列中的值,该列位于&#34; company&#34;列中。同一条线。结果提取将是:

df$new <- c(1,3,2)
df

2 个答案:

答案 0 :(得分:0)

编辑:eddi的答案可能更好。您更有可能使用数据帧而不是单个行向量。

我不确定我是否理解你的问题,从你的描述中不清楚。但似乎你要求数据值的对角线,因为这将是&#34;名称在列&#34;公司&#34;同一行&#34;。以下将执行此操作:

df$new <- diag(matrix(c(compA,compB,compC), nrow = 3, ncol = 3))

diag函数将为您返回矩阵的对角线。所以我首先将三个原始矢量连接成一个矢量,然后将其指定为包裹成三行三列的矩阵。然后我走了对角线。然后将整个内容添加到数据框中。

这回答了你的问题吗?

答案 1 :(得分:0)

您设置的方式,每个公司都有一行一列,行和列的顺序相同。如果这是您的真实数据集,那么正如其他人所说diag(...)是解决方案(您应该选择该答案)。

如果您的真实数据集有多个公司实例(例如,每个公司有多个行,那么这更通用:

# using your df
sapply(1:nrow(df),function(i)df[i,as.character(df$company[i])])
# [1] 1 3 2

# more complex case
set.seed(1)    # for reproducible example
newdf <- data.frame(company=LETTERS[sample(1:3,10,replace=T)],
                    A = sample(1:3,10,replace=T), 
                    B=sample(1:5,10,replace=T), 
                    C=1:10)
head(newdf)
#   company A B C
# 1       A 1 5 1
# 2       B 1 2 2
# 3       B 3 4 3
# 4       C 2 1 4
# 5       A 3 2 5
# 6       C 2 2 6
sapply(1:nrow(newdf),function(i)newdf[i,as.character(newdf$company[i])])
#  [1] 1 2 4 4 3 6 7 2 5 3