FOR循环用于从R中的数据帧中提取字符串

时间:2014-12-29 05:12:06

标签: r

希望格式化是正确的,这是我的第一个问题。

这是代码:

a<-c("alice", "bob", "chris")
b<-c("Ally", "Billy", "Chaz")
c<-c("Arnice", "Brandon", "Charles")
df1<-data.frame(a,b,c)
df2<-c("0","0","0")
df2<-data.frame(df2)
for (n in nrow(df1)) {
df2[[n,1]]<-df1[[n,n]]
}
print(df2)

换句话说,我希望沿着数据帧df1的对角线获取字符串(我需要做一些更复杂的事情,所以我正在寻找一般答案),并将结果写入DF2。所以我想要的结果是一个矢量,上面写着爱丽丝,比利,查尔斯。但相反,我得到一个说0,0,NA的矢量。

我做错了什么?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

diag转换为data.frame后使用matrix功能:

diag(as.matrix(df1))
# [1] "alice"   "Billy"   "Charles"

假设您的数据是方形(行数和列数相同),您可以手动执行以下操作:

df1[cbind(1:nrow(df1), seq_len(ncol(df1)))]

更新:您现有代码的一些问题

在您目前的代码中,您使用的是双括号([[)和factors,这两种情况都会产生问题。

与下面的比较,我在创建空&#34; df2&#34;时添加了stringsAsFactors = FALSE,并使用as.character将输出转换为字符:

df2 <- c("0","0","0")
df2 <- data.frame(df2, stringsAsFactors = FALSE)

for (n in seq_len(nrow(df1))) {
  print(df1[n, n])
}
# [1] alice
# Levels: alice bob chris
# [1] Billy
# Levels: Ally Billy Chaz
# [1] Charles
# Levels: Arnice Brandon Charles

for (n in seq_len(nrow(df1))) {
  df2[n, 1] <- as.character(df1[n, n])
}
df2
#       df2
# 1   alice
# 2   Billy
# 3 Charles